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

Posted

技术标签:

【中文标题】Matlab-下标索引必须是实数正整数或逻辑数【英文标题】:Matlab-Subscript indices must either be real positive integers or logicals 【发布时间】:2012-11-27 03:13:38 【问题描述】:

我哪里做错了? 问题出在:R = sqrt(bsxfun(@minus,XX,(XX)').^2+bsxfun(@minus,YY,(YY)').^2);

EO = 8.8541e-12; %eps0
A2 = 1.0e-2; %2a
N = 100; %num of subareas in a plate
M = sqrt(N); %num of subareas in one axis
DX = A2/M; % 2b
DY = DX; %2b
DL = DX; %2b

%  SECOND, CALCULATE THE ELEMENS OF THE COEFFICIENT MATRIX A
% Write all the subareas centers coordinates to X and Y 
%  SECOND, CALCULATE THE ELEMENS OF THE COEFFICIENT MATRIX A
% Write all the subareas centers coordinates to X and Y 
x = linspace(DL*0.5,DL*(M-0.5),M);
y = x;
[XX,YY]=meshgrid(x,y);
%%L = NaN(N,N);
**R = sqrt(bsxfun(@minus,XX,(XX)').^2+bsxfun(@minus,YY,(YY)').^2);**
idx_diagL = find(eye(N)~=0);
idx_not_diagL = find(eye(N)==0);
L(idx_not_diagL) = DL^2./(4.*pi*EO*R(mod(idx_not_diagL,10),floor(idx_not_diagL/N)));
L(idx_diagL)  = DL*0.8814/(pi*EO); %ln(1+sqrt(2)= 0.8814

【问题讨论】:

另见this questionthe generic solution to this problem。 【参考方案1】:

问题出在不是你说的地方,而是在下面一行:

L(idx_not_diagL) = DL^2./(4.*pi*EO*R(mod(idx_not_diagL,10),floor(idx_not_diagL/N)));

简而言之,您的问题是您为矩阵 R 指定零索引,但在 MATLAB 中,零索引是非法的(它们从 1 开始,而不是 0!)。

现在,您从哪里获得零索引?您可以使用以下行和列下标对R(..., ...) 进行索引:

mod(idx_not_diagL, 10)

floor(idx_not_diagL / N))

两者偶尔会得到零值。

作为修复,我建议对行索引使用以下内容:

mod(idx_not_diagL, 10) + 1

至于列索引,还有另一个问题。 floor(...) 表达式的范围从 0 到 99。一旦你修复它(我不确定你想要实现什么),它就会起作用。

【讨论】:

谢谢,但我认为我试图做的就像不可能完成的任务......我试图让 R 成为 NXN 距离矩阵但失败了......当然我在这里所做的是 R(10 ,10) 而是尝试在访问 R 时找出正确的索引,相当铁杆...... 我不确定我是否理解你刚才所说的。

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

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

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

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

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

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

“数组索引必须是正整数或逻辑值”