将一部分Cell Array与Scalar Matlab相乘

时间:2014-09-15 14:06:51

标签: arrays matlab partial multiplication scalar

我有一个像这样的一组轨道的单元格数组:

<TL1x3> double
<TL1x3> double
<TL3x3> double
...

其中TL代表轨道长度。每个元素的值都不同,但总有三列:time,x coord,y coord。

从跟踪算法中我得到x和y坐标(以像素为单位)。但是,我需要它们在nm中,所以我必须将它们与一个值相乘,但只有第二个和第三个,而不是每个元素的第一列,例如:

0    5    6     x2     0    10    12
0.5  7    2    --->    0.5  14    4
1    8    1            1    16    2
...                    ...

这对于数组的每个元素都是。

使用cellfun,我已设法更改阵列的每个单元格,但我不知道如何只更改一个部分。你知道怎么做这个......?

3 个答案:

答案 0 :(得分:1)

您可以通过创建一个调用bsxfun()并将其传递给cellfun()的匿名函数来执行此操作。假设您的输入数据位于单元格数组inputData中,并且要应用的比例因子位于标量变量scaleFactor中;

scaledData = cellfun(@(X) bsxfun(@times, X, [1 scaleFactor scaleFactor]), inputData, 'UniformOutput', false);

我认为这会给出你想要的结果

答案 1 :(得分:1)

给出样本输入:

c={[1 2 3]; [4 5 6]; [7 8 9; 10 11 12; 13 14 15]};

然后:

xf = sparse([1 0 0; 0 2 0; 0 0 2]);
d=cellfun(@(x) x * xf, c, 'uniformoutput', false);

答案 2 :(得分:0)

它可能不是最优雅也不是最有效的方法,但将您的单元格数组转换为矩阵可以简化您的工作:

A = {[0    5    6] ;
[0.5  7    2];
[1    8    1 ]}

B = cell2mat(A)

B(:,2:end) = 2*B(:,2:end)

在命令窗口中给出:

A =

[1x3 double]
[1x3 double]
[1x3 double]

在:

B =

         0    5.0000    6.0000
    0.5000    7.0000    2.0000
    1.0000    8.0000    1.0000

后:

B =

         0   10.0000   12.0000
    0.5000   14.0000    4.0000
    1.0000   16.0000    2.0000

您还可以创建一个临时单元格数组,其中包含原始单元格数组的最后两列,然后对其应用cellfun并将其放回原始单元格中。速度/性能是否适合您?