【问题标题】:MATLAB error: Subscript indices must either be real positive integers or logicalsMATLAB 错误:下标索引必须是实数正整数或逻辑数
【发布时间】:2014-09-25 20:24:58
【问题描述】:

我目前正在运行我的代码,发现了一个烦人的问题,我真的没有任何想法要解决。

我正在研究的功能如下;

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

而血腥的问题就出现在这一行:

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

说“下标索引必须是真正的正整数或逻辑。” 好吧,输入变量“PriceMat”是60x10的价格矩阵,“Symbols”是10x1的字符串。

还有一个问题:) “下标索引”到底是什么意思?

非常感谢提前xx

【问题讨论】:

    标签: matlab


    【解决方案1】:

    让我们一次一个地解决您的问题:

    "下标索引必须是正整数或逻辑数。"好吧,输入变量“PriceMat”是60x10的价格矩阵,“Symbols”是10x1的字符串。

    查看您的 CointPairs 变量。这是使用find 命令的结果。 CointPairs 可能会产生 empty 矩阵。这是因为当您运行find 时,可能存在CointMatrix没有条目 等于1(或实际上非零)的情况。如果是这种情况,那么CointPairs 实际上将是空的,因为没有满足要求的元素。

    因此,您收到该错误的原因是您试图在不允许的情况下对 empty 矩阵执行操作。您需要在执行CointPairs = [rows, cols]; 之前移动您的if 语句。这样,您将不会遇到任何访问错误。换句话说,这样做:

    [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...
    %// ...
    

    我的一个小评论是您的输出变量是out,但您没有在代码中的任何位置分配它。这是故意的吗?


    还有一个问题 :) “下标索引”到底是什么意思?

    下标索引是用于访问数组/矩阵中元素的值。例如,假设您的矩阵是:

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

    通过A(2,2),我们得到元素5。第2行和第2列被称为下标索引。索引意味着不止一个,因此您可以使用两个元素数组来访问矩阵的行和列,而不仅仅是一对行和列位置。对中的每一对对应元素是一个下标索引。

    基本上,它们是用于访问矩阵的行和列的数字。您只能使用 正数(也称为 1、2、3、4...)或 逻辑运算符(即true / false)访问矩阵/数组中的元素。不允许使用空矩阵、0、负整数或浮点数。

    因为您没有使用上述任何一个有效输入来访问您的矩阵,所以您会收到该错误。


    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      "Subscript indices must either be real positive integers or logicals." 表示您尝试引用的索引不存在。很可能是 CointPairs(:,2) 不存在。

      所以我的建议是在CointPairs = [rows, cols]; 行中放置一个断点,然后查看 CointPairs 矩阵的大小。看看第二列是否存在..

      希望这会有所帮助..

      【讨论】:

        【解决方案3】:

        这是另一种可能性,我花了一点时间才弄清楚......

        我定义了

        % 作为变量 图 = 1;

        基本上我重载了 MATLAB 的绘图函数,这是一个很大的禁忌!!

        【讨论】:

          【解决方案4】:

          我遇到了同样的问题,但在我的情况下,下标索引实际上是硬编码的整数。因此,上述解决方案对我不起作用。问题是我正在同时编辑和运行多个 matlab 文件(脚本)。这导致缓冲区没有被清除或其他东西,比如变量被相互覆盖。

          解决办法:

          在您的 matlab 脚本顶部写上clear all

          【讨论】:

            猜你喜欢
            • 2012-12-29
            • 2013-04-19
            • 2012-11-27
            • 2013-12-04
            • 2014-02-02
            • 2021-07-02
            • 2012-04-14
            相关资源
            最近更新 更多