Matlab错误:下标索引必须是实数正整数或逻辑数
Posted
技术标签:
【中文标题】Matlab错误:下标索引必须是实数正整数或逻辑数【英文标题】:Matlab error : Subscript indices must either be real positive integers or logicals 【发布时间】:2012-12-29 05:19:23 【问题描述】:我在 MATLAB 中出现以下错误:
???下标索引必须是实数正整数或 逻辑。
==> Lloyd_Max 在 74 D(w_count) = mean((x - 中心(xq)).^2);
这是我的代码:
function [ xq,centers,D ] = Lloyd_Max( x,N,min_value,max_value )
%LLOYD_MAX Summary of this function goes here
% Detailed explanation goes here
x = x';
temp = (max_value - min_value)/2^N;
count=1;
for j=0:temp:((max_value - min_value)-temp),
centers(count) = (j + j + temp )/2;
count = count + 1;
end
for i=1:length(centers),
k(i) = centers(i);
end
w_count = 0;
while((w_count < 2) || (D(w_count) - D(w_count - 1) > 1e-6))
w_count = w_count + 1;
count1 = 2;
for i=2:(count-1),
T(i) = (k(i-1) + k(i))/2;
count1 = count1 +1 ;
end
T(1) = min_value;
T(count1) = max_value;
index = 1;
for j=2:count1,
tempc = 0;
tempk = 0;
for k=1:10000,
if(x(k) >= T(j-1) && x(k) < T(j))
tempk = tempk + x(k);
tempc = tempc + 1;
end
end
k(index) = tempk;
k_count(index) = tempc;
index = index + 1;
end
for i=1:length(k),
k(i) = k(i)/k_count(i);
end
for i=1:10000,
if (x(i) > max_value)
xq(i) = max_value;
elseif (x(i) < min_value)
xq(i) = min_value;
else
xq(i) = x(i);
end
end
for i=1:10000,
cnt = 1;
for l=2:count1,
if(xq(i) > T(l-1) && xq(i) <= T(l))
xq(i) = cnt;
end
cnt = cnt +1 ;
end
end
D(w_count) = mean((x - centers(xq)).^2);
end
end
我称之为并有这些输入:
M = 10000
t=(randn(M,1)+sqrt(-1)*randn(M,1))./sqrt(2);
A= abs(t).^2;
[xq,centers,D] = Lloyd_Max( A,2,0,4 );
我试图评论 while 和 D,Results : 我得到了 xq 和中心都正常,xq 在 1-4 范围内,中心 1-4 索引和 0.5-3.5 范围。
我不知道这里出了什么问题...请帮助我。
提前致谢!
谜团解开!
感谢大家的帮助! 我刚刚退出了 for 循环:
for i=1:10000,
if (x(i) > max_value)
xq(i) = max_value;
elseif (x(i) < min_value)
xq(i) = min_value;
else
xq(i) = x(i);
end
end
它就像魅力一样工作......这个循环再次初始化数组。对此感到抱歉。再次感谢你!
【问题讨论】:
另见this questionthe generic solution to this problem。 【参考方案1】:在您的函数中间某处有一个赋值 xq(i) = x(i)
,但是您从外部将 A
传递为 x
,您从 t
计算 A
,这是由 randn
采样的,所以您不能保证xq
是一个整数。
【讨论】:
我在您的代码中没有看到任何unique
,并且输入是随机的。你能在分配D(w_count)
之前再次运行上面的代码并为我disp(xq)
吗?【参考方案2】:
我不确定你的目标是什么,但你的向量 xq
不包含整数,它包含双精度数。如果您想像使用 centers(xq)
一样使用索引向量,则向量的所有元素都必须是整数。
经过一番检查,看起来 xq 是 x 值,您应该找到某种方法将它们映射到它们所属的最近单元格的整数(我猜“中心”代表单元格的中心?)
【讨论】:
xq 包含整数,当我手动尝试 ans = center(xq) 时,它就像魅力一样。这是信号 A 的非均匀量化器。xq 是量化后产生的信号,因此如果我输入 unique(xq),则结果为 1、2、3、4。我从第一个 while 循环中得到结果,因为我推荐了 while 循环和 D。 不,因为您编写的代码xq
主要由向量x
构造,也就是您在输入行中创建的A
。 A
不是整数向量。尝试编辑您的代码以在错误之前显示Nq(1:10)
行,您将明白我的意思。如果您获得所有整数值,则您正在运行的代码与您发布的代码不同。
我在 D 赋值之前使用了 disp(xq) (推荐 D 和 while 循环来运行它)。我得到 xq 的值从 1 到 4 所有整数。问题是如果你注意到我在 xq(i) = x(i) 之后用整数 cnt 重新分配 xq。 cnt 只能取 1 到 4 之间的值,但如果它可以取更多,它将是一个整数,因为我只将它增加 1。
取消注释D
行和while 循环并再次查看。
谢谢你的评论,你真的帮了我:)以上是关于Matlab错误:下标索引必须是实数正整数或逻辑数的主要内容,如果未能解决你的问题,请参考以下文章
matlab错误:Subscript indices must either be real positive integers or logicals.