for循环中的下标分配维度不匹配

时间:2013-11-26 00:13:10

标签: matlab

我正在尝试编写一个函数来对数字向量进行分类。

function [a]=classify(x)
i=length(x);
for j=1:1:i
  if(x(j)<0.5)
      a(j,j,:)='low';
  elseif(x(j)==0.5)
      a(j,1,:)='medium';
  else
      a(j,1,:)='high';
  end
end

当我尝试代码时,我收到了订阅分配维度不匹配错误。

classify([0.5 0.1])
Subscripted assignment dimension mismatch.

Error in classify (line 5)
 a(j,1,:)='low';
由于矩阵的大小,

是错误吗?我查看了其他解决方案,但似乎没有一个解决方案。

1 个答案:

答案 0 :(得分:2)

第一次通过您的函数j = 1,所以输入向量中的值最终会分配:

a(j,1,:)='medium';

您可以查看:

>>size(a)
ans =
     1     1     6

下次循环时,您有j = 2,然后分配:

a(j,j,:)='low';

但是这会导致错误,因为你的数组期望新的字符串赋值,沿着数组的第三维,也有长度= 6('medium'的长度),因为这是你用来初始化你的值阵列。

你的数组认为这是一个不兼容的赋值,给出了错误。

要解决这个问题,你需要使用像Cell数组这样的东西,它可以容纳可变数据大小甚至类型。

所以你的代码需要看起来像这样(注意数组的从()到{}的变化):

function [a]=classify(x)
i=length(x);
for j=1:1:i
  if(x(j)<0.5)
      a{j,j,:}='low';
  elseif(x(j)==0.5)
      a{j,1,:}='medium';
  else
      a{j,1,:}='high';
  end
end

例如,对数据执行此修改后的函数会产生:

classify([0.5 0.1])

ans = 

    'medium'       []
          []    'low'

我不知道这是否在您的应用程序的其余部分中正常工作,但至少这为您提供了正确的数据结构。

最后评论,我不明白为什么你的数组中有3个维度,你为什么不使用:

function [a]=classify(x)
i=length(x);
for j=1:1:i
  if(x(j)<0.5)
      a{j,:}='low';
  elseif(x(j)==0.5)
      a{j,:}='medium';
  else
      a{j,:}='high';
  end
end

给出输出(任意输入向量):

classify([rand(1,6)])'

ans = 

    'high'    'low'    'high'    'low'    'low'    'low'