2013-03-09 225 views
0

假设我有一个4x1单元阵列,A,内每个小区是一个2x5矩阵,在Matlab添加一个常数的矩阵的指定列的单元阵列

A={[1 1 1 1 1; 2 2 2 2 2]; 
    [3 3 3 3 3; 4 4 4 4 4]; 
    [5 5 5 5 5; 6 6 6 6 6]; 
    [7 7 7 7 7; 8 8 8 8 8]} 

我想是添加一个常数,比如说100,对应于每个单元格的4th列,以制作B。例如

B={[ 1 1 1 101 1; 2 2 2 102 2]; 
    [3 3 3 103 3; 4 4 4 104 4]; 
    [5 5 5 105 5; 6 6 6 106 6]; 
    [7 7 7 107 7; 8 8 8 108 8]} 

这样做的最佳方法是什么?

我可以用

B=cellfun(@(x) x(:,4)+100,A,'uni',0) 

得到相加的结果,但有难以得到B.任何帮助是极大的赞赏。

回答

3

如果你能保证在A细胞矩阵是相同的尺寸(在你的情况下,2×5矩阵),您可以纵向串联所有矩阵:

B = cat(1, A{:}); 

再加入100〜第四柱:

B(:, 4) = B(:, 4) + 100; 

,然后转换回回单元阵列:

B = mat2cell(B, size(A{1}, 1) * ones(size(A)), size(A{1}, 2)); 

在这种情况下,请考虑将数据表示为三维矩阵而不是单元阵列。操作起来会容易得多。

在一般情况下,你会采用for循环:

B = A; 
for k = 1:numel(A) 
    B{k}(:, 4) = B{k}(:, 4) + 100; 
end 
+0

@ EitanT,感谢您的快速回复,如果每个单元格内矩阵的长度(行数)不同,你会提出什么建议? – tytamu 2013-03-09 22:37:22

+0

@ Tai-YenChen正如我在答案中已经提到的那样,使用'for'循环。它不像你所期望的那样缓慢...... :) – 2013-03-09 22:39:18

+1

@ EithanT,在我的帖子XD之前,我没有在答案中看到有关for循环的信息。再次感谢。 – tytamu 2013-03-09 22:43:14

1

您可以将矩阵添加到每个单元,如下图所示:

B=cellfun(@(x) x+[0 0 0 100 0;0 0 0 100 0],A,'UniformOutput',false); 
相关问题