web-dev-qa-db-fra.com

Erreur MATLAB: les indices en indice doivent être des nombres entiers positifs réels ou des logiques

Je suis en train de faire fonctionner mon code et j'ai trouvé un problème ennuyant que je n'ai vraiment aucune idée à résoudre.

La fonction que je travaille est la suivante;

function out = CointPairs(PriceMat, Symbols)
    out=[];
    NofStocks = size(PriceMat, 2);
    CointMatrix= zeros(NofStocks);

    [rows, cols] = find(CointMatrix);
    CointPairs = [rows, cols];
    **cf= (CointPairs(:,1)-CointPairs(:,2))==0;**
    CointPairs(cf,:) = [];

    if(isempty(CointPairs))
        warning('No Cointegrated Pairs Found')
        return
    end
end

Et le problème sanglant se produit à cette ligne:

cf= (CointPairs(:,1)-CointPairs(:,2))==0;

en disant que "les indices en indice doivent être de vrais entiers positifs ou des logiques". Eh bien, la variable d'entrée "PriceMat" est la matrice de prix 60x10, et "Symbols" est une chaîne de 10x1.

Une autre question :) que signifie exactement "indices en indice"?

BEAUCOUP apprécié à l'avance xx

4
Vivian

Abordons vos questions une à la fois:

"Les indices d’indice doivent être des entiers positifs réels ou des logiques." Eh bien, la variable d'entrée "PriceMat" est la matrice de prix 60x10, et "Symbols" est une chaîne de 10x1.

Examinez votre variable CointPairs. C'est le résultat de l'utilisation de la commande find. Il peut arriver que CointPairs produise la empty matrix. En effet, lorsque vous exécutez find, il peut arriver qu'il y ait aucune entrée dans votre CointMatrix où il est égal à 1 (ou différent de zéro en réalité). Si tel est le cas, CointPairs sera en fait vide car aucun élément ne répond aux exigences.

En tant que tel, vous obtenez cette erreur parce que vous essayez d'effectuer des opérations sur une matrice empty / lorsque cela n'est pas autorisé. Vous devez déplacer votre instruction if before vous faites CointPairs = [rows, cols];. De cette façon, vous ne recevrez aucune erreur d'accès. En d'autres termes, faites ceci:

[rows, cols] = find(CointMatrix);
CointPairs = [rows, cols];

%// Move here
if(isempty(CointPairs))
    warning('No Cointegrated Pairs Found');
    out = []; %// Make output empty - Must return something or you get an error
    return
end

%// Continue here
cf= (CointPairs(:,1)-CointPairs(:,2))==0;
CointPairs(cf,:) = [];

%// More code here...
%// ...

Un commentaire mineur que j'ai est que votre variable de sortie est out, mais vous ne l'attribuez nulle part dans votre code. Est-ce intentionnel?


Une autre question :) que signifie exactement "indices en indice"?

Les indices d'indice sont les valeurs que vous utilisez pour accéder aux éléments de votre tableau/matrice. Par exemple, supposons que votre matrice soit:

A = [1 2 3; 4 5 6; 7 8 9];

En faisant A(2,2), nous obtenons l'élément 5. La ligne 2 et la colonne 2 sont appelées indice indice . Les indices en impliquant plus d'un, vous pouvez donc utiliser deux tableaux d'éléments pour accéder aux lignes et aux colonnes de votre matrice au lieu d'une seule paire d'emplacements de lignes et de colonnes. Chaque paire d'éléments correspondants dans la paire est un index en indice.

Ce sont essentiellement des nombres que vous utilisez pour accéder aux lignes et aux colonnes de votre matrice. Vous ne pouvez accéder aux éléments des matrices/tableaux à l'aide de nombres positifs (a.k.a. 1, 2, 3, 4 ...) ou de opérateurs logiques (i.e. true / false). La matrice vide, 0, les entiers négatifs ou les nombres à virgule flottante ne sont pas autorisés.

Parce que vous accédez à votre matrice en utilisant aucune des entrées valides ci-dessus, vous obtenez cette erreur.


J'espère que cela t'aides!

4
rayryeng

"Subscript indices must either be real positive integers or logicals." signifie que l'index que vous essayez de référencer n'existe pas. Il est fort probable que CointPairs (:, 2) n'existe pas.

Ma suggestion est donc de mettre un point de rupture dans la ligne CointPairs = [rows, cols]; et de voir la taille de la matrice CointPairs. et voir si la deuxième colonne existe ..

J'espère que cela t'aides..

2
lakesh

Voici une autre possibilité qui m'a pris un peu pour comprendre ...

J'ai défini

% sous forme de graphique variable = 1;

En gros, j'ai surchargé la fonction de tracé de MATLAB qui est un gros non-non !!

1
Huckleberry Febbo

J'ai eu le même problème, mais dans mon cas, les indices en indice étaient en réalité des entiers codés en dur. Par conséquent, les solutions ci-dessus n'ont pas fonctionné pour moi. Le problème était que je montais et exécutais simultanément plusieurs fichiers matlab (scripts). Cela a pour résultat que la mémoire tampon n'est pas effacée ou quelque chose comme des variables écrites les unes sur les autres.

La solution:

Écrivez clear all en haut de votre script matlab.

0
Ayushi Jha