用于具有组合的结构的循环

时间:2012-07-26 23:16:23

标签: matlab matrix combinatorics cell-array

我想创建一个目标矢量。其中我遇到了一些问题。 我想要的是从T到Target的所有18个对象中的3个组合。但它无法产生这种组合。它适用于每个组合,但对我来说,“for循环”似乎不起作用。

% T is a structure of 18 different sized objects  

% idx is index of size 816*3 double 
idx = combnk(1:18,3);    

% TNames is cell of size 18*1 
TNames = fieldnames(T);  

for i = 1:length(idx) 

  Target(:,:,i) = [T.(TNames{idx(i,1)}) ; 
                   T.(TNames{idx(i,2)}) ; 
                   T.(TNames{idx(i,3)}) ]; 

end

当我从Target(:,:,i)删除(:,:,i)并在T的位置写1,2,3 ......时,上面的代码工作正常。(TNames {idx(i,1)}).. T.(TNames {idx(i,2)})和T.(TNames {idx(i,3)})

我曾尝试过不同的选择,但我无法解决这个问题。我甚至可以创建一个目标< 3 * 859 cell>但神经网络是不可接受的。它需要是< 1 * 859细胞>神经网络正常工作..所以,有人可以帮助我解决这个问题吗?

我也试过这个:

T是< 1 * 1结构>在我的内心 18个Fints(金融时间序列)对象,每个对象859行 和不同的列(范围从1到4列 在每个fints对象中)..我已经转换了所有这些fints 通过fts2mat命令将对象转换为矩阵。

现在我有了新的矩阵< 32 * 859 double>可识别的 在每个列范围中查找对象。即我可以识别 每列中的前四个条目属于第一个 fints对象和接下来的3个条目属于第二个fints 对象等等。

我想抓住所有组合(816种组合) 在这样的新矩阵中有3个fints对象(18个中的对象) 最终可以将其转换为< 859 * 1单元格>的方法要么 < 1 * 859细胞> (更确切地说)为神经提供 网络进行适当的培训......

此任务必须通过索引来完成,因为每个 3的组合应该包含3个fints对象条目 每个fints对象有不同的no。列。 而且我必须装饰每个fints对象的所有列 每次都在我的816组合中并将它们连接起来 3个fints对象。取每个鳍的所有列 对象并将其放入行中。

简而言之,我应该有< 1 * 859 cell>其中有 816个不同组合的3个鳍对象(出于 我的T结构)和每个组合应该有3个fints 其中的对象和每个组合应该是 < 1 * 859细胞>将它提供给神经网络以使其适当 训练。由于NN不采用不同的维度单元格。

我提前感谢你

1 个答案:

答案 0 :(得分:0)

说明问题的一个例子:

%# structure with 4 "differently sized objects"
T = struct('a',1, 'b',rand(2,2), 'c','string', 'd',{{1 2}})

%# what you are trying to do in the loop is:
[T.a T.b T.c]             %# <---- ERROR!

会抱怨:

Error using horzcat
CAT arguments dimensions are not consistent.

MATLAB矩阵/向量只能存储相同类型的一致元素。这里一个是标量,另一个是2乘2矩阵,最后一个是字符串......

您想要使用单元格数组:

TNames = fieldnames(T);
idx = nchoosek(1:numel(TNames),3);

C = cell(size(idx,1),1);
for i=1:size(idx,1)
    C{i} = {T.(TNames{idx(i,1)}) T.(TNames{idx(i,2)}) T.(TNames{idx(i,3)})};
end

例如,最后一个组合是:

>> C{end}
ans = 
    [2x2 double]    'string'    {1x2 cell}

对应{T.b T.c T.d}