我正在尝试编写一个函数来对数字向量进行分类。
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';
由于矩阵的大小,是错误吗?我查看了其他解决方案,但似乎没有一个解决方案。
答案 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'