我想使用svm训练各种标签上的数据,并希望svm模型作为struct的数组。我这样做但收到错误:
不同结构之间的订阅分配。
请帮帮我
model = repmat(struct(),size);
for i=1:size
model(i) = svmtrain(train_data,labels(:,i),'Options', options);
end
答案 0 :(得分:0)
MATLAB中的结构数组只能包含相同字段的结构。首先创建一个空结构 1 的数组,然后尝试用SVMStruct
结构填充它,您尝试创建一个带有一些空结构和一些SVMStruct
结构的混合数组。这是不可能的,因此MATLAB抱怨"不同的结构" (不等于结构:空与SVMStruct
)。
要分配一个结构数组,你必须在初始化期间指定所有字段并用初始值填充它们 - 在这种情况下这是相当不方便的。一个非常简单的选择是放弃这个初始化,然后以 2,3 的方式运行你的循环:
for ii=sizeOfLabels:-1:1
model(ii) = svmtrain(train_data,labels(:,ii),'Options', options);
end
这样,对于ii=sizeOfLabels
,例如ii=100
,MATLAB会调用model(100)=...
,而model
尚不存在。然后,它将分配100个SVMStruct
所需的所有空间,并用空值填充前99个实例。这样你就可以预先分配内存,而不必担心初始化值。
<小时/> 1 注意:如果是
size=5
,调用repmat(struct(),size)
将创建 5 x 5 空结构矩阵。要创建 1 x 5 结构数组,请调用repmat(struct(),1,size)
。
2 Don't use size
as a variable name,因为这是一个函数。如果您这样做,则无法再使用size
功能。
3 i
and j
denote the imaginary unit in MATLAB。将它们用作变量可以减慢代码速度并且容易出错。使用例如<{1}}或k
代替循环。