MATLAB 错误:下标索引必须是实数正整数或逻辑数

Posted

技术标签:

【中文标题】MATLAB 错误:下标索引必须是实数正整数或逻辑数【英文标题】:MATLAB error: Subscript indices must either be real positive integers or logicals 【发布时间】: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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于MATLAB 错误:下标索引必须是实数正整数或逻辑数的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB 下标索引必须是实数正整数或逻辑数

Matlab-下标索引必须是实数正整数或逻辑数

下标索引必须是实数正整数或逻辑数

MATLAB“下标索引必须是真正的正整数或逻辑”

下标索引必须是真正的正整数或逻辑,通用解决方案

matlab错误:Subscript indices must either be real positive integers or logicals.