MATLAB:根据向量将单元格的成员划分为更小的单元格

时间:2013-10-18 22:22:57

标签: matlab for-loop vectorization

我有一个大小为1 * n(X=cell(1, n))的单元格数组。该单元阵列(X)中的每个单元具有不同的大小。所以,要清楚,这是一个例子:

X = {X1, X2, X3} (n=3)
X1 = [1 3 5 9]
X2 = [1 2 3 6 7]
X3 = [1 7 8 9]

我有一个长度为m的向量。例如:

Y = [0 3 6 9] (m=4)

我想以这种方式根据此向量划分我的单元格数组中的单元格:

X1-1=[1] (because 1>=Y(1) & 1<Y(2)), X1-2=[3 5] (because 3 and 5>=Y(2) & 1<Y(3)), X1-3=[9] (because 9>=Y(3) & 9<Y(4))

以及X2和X3 ...... 最后我有:

Z = {X1-1 X2-1 X3-1
     X1-2 X2-2 X3-2
     X1-3 X2-3 X3-3}

这是我的for循环代码:

Z = cell(size(X,2), size(Y,2));
for i = 1:size(X,2)
    T = cell2mat(X(i));
    for j = 1:size(Y,2)-1
        idx = (T > Y(j) & T < Y(j+1));
        Z{i,j} = {T(idx)'};
    end
end
Z = cellfun(@(z) cell2mat(z), Z, 'UniformOutput', false);

我想在不使用for循环的情况下获得相同的结果。任何矢量化的想法?

1 个答案:

答案 0 :(得分:0)

您可以将一个for和一个cellfun替换为两个arrayfun循环。但不一定更快:

Z = cellfun(@(Xi) arrayfun(@(k) Xi(Y(k)<=Xi&Xi<Y(k+1)), 1:numel(Y)-1, 'uni', 0).', X, 'uni', 0);

所需结果存储在Z{1}{1}(对应于您的X1-1),Z{1}{2}(对应于X1-2)等。

示例:我正在使用您的数据,但将Y更改为[0 3 6 9.1](请注意,对于Y = [0 3 6 9],示例中的X1-3不正确):

>> Z{1}{1}

ans =

     1

>> Z{1}{2}

ans =

     3     5

>> Z{1}{3}

ans =

     9

>> Z{2}{1}

ans =

     1     2