代码如何呈现以下矩阵

时间:2012-09-06 12:05:29

标签: matlab bsxfun

我在做研究。我有问题使代码显示以下矩阵。

A(:,:,1)=[ 1 2 3 4;
           3 2 1 4]
A(:,:,2)=[ 1 3 4 2;
           4 2 1 3]

C(:,:,1)=[ 0 0 1 2;
           1 1 1 0]
C(:,:,2)=[ 1 0 1 0;
           0 1 1 1]

矩阵C是矩阵,表示矩阵A中的值之前有多少个零。

我有以下矩阵来表示矩阵中的值A.

value=1, 
B(1)=[1 1 1;
      1 1 1]
value=2,
B(2)=[2 2 2;
      2 2 2]
value=3,
B(3)=[3 3 3;
      4 4 4]
value=4,
B(4)=[4 4 4;
      3 3 3]

因此,我将通过组合A和C得到以下矩阵。

Res(:,:,1)=[1 1 1 2 2 2 0 3 3 3 0 0 4 4 4;
            1 1 1 2 2 2 0 4 4 4 0 0 3 3 3;
            0 3 3 3 0 2 2 2 0 1 1 1 4 4 4;
            0 4 4 4 0 2 2 2 0 1 1 1 3 3 3]

Res(:,:,2)=[0 1 1 1 3 3 3 0 4 4 4 2 2 2 0;
            0 1 1 1 4 4 4 0 3 3 3 2 2 2 0;
            4 4 4 0 2 2 2 0 1 1 1 0 3 3 3;
            3 3 3 0 2 2 2 0 1 1 1 0 4 4 4]

我从其他论坛得到了以下内容。

CP = bsxfun(@minus, 3 , sum(C,2));
G = mat2cell(C,ones(size(C,1),1),ones(size(C,2),1),ones(size(C,3),1));
CP = mat2cell(CP,ones(size(CP,1),1),ones(size(CP,2),1),ones(size(CP,3),1));
D = B(A);
E = cellfun(@(x,n) [zeros(size(x,1),n) x], D, G,'UniformOutput',false);
for ii=1:depth;
    E(:,end,ii) = cellfun(@(x,n) [x,zeros(size(x,1),n)],E(:,end,ii),CP(:,:,ii),...
   'UniformOutput',false);
    NewMatrice(:,:,ii)=cell2mat(E(:,:,ii));
end

你的意见是什么?

1 个答案:

答案 0 :(得分:2)

对于初学者,我不明白你的矩阵A如何包含第一个A = [ 1 2 3 4; 3 2 1 4]A(1)A(2)A(3)和{{1}在同一时间。

我想你有以下内容:

A(4)

假设这样,您可以通过以下方式获得所需的结果:

A = [1, 2, 3, 4; 3, 2, 1, 4];
B(:, :, 1) = [1, 1, 1; 1, 1, 1];
B(:, :, 2) = [2, 2, 2; 2, 2, 2];
B(:, :, 3) = [3, 3, 3; 4, 4, 4];
B(:, :, 4) = [4, 4, 4; 3, 3, 3];

产生:

Res = cell2mat(arrayfun(@(n)B(:, :, n), A, 'UniformOutput', false));


编辑#1:

在您的问题更新后,如果您有另一个矩阵Res = 1 1 1 2 2 2 3 3 3 4 4 4 1 1 1 2 2 2 4 4 4 3 3 3 3 3 3 2 2 2 1 1 1 4 4 4 4 4 4 2 2 2 1 1 1 3 3 3 表示要在C = [0, 0, 1, 2; 1, 1, 1, 0]矩阵之前插入的前导零的数量,您可以通过以下方式获得所需的结果:< / p>

B

这会产生:

my_func = @(n)[zeros(size(B(:, :, A(n)), 1), C(n)), B(:, :, A(n))];
Res = cell2mat(arrayfun(my_func, reshape(1:numel(A), size(A)), 'Uniform', false))


编辑#2:

在对您的问题进行第二次更新后,如果您的Res = Columns 1 through 15 1 1 1 2 2 2 0 3 3 3 0 0 4 4 4 1 1 1 2 2 2 0 4 4 4 0 0 3 3 3 0 3 3 3 0 2 2 2 0 1 1 1 4 4 4 0 4 4 4 0 2 2 2 0 1 1 1 3 3 3 A矩阵是3维的,则会增加代码的复杂性。我发现最简单的方法是使用C循环并将问题简化为2-D,如下所示:

for

如果您希望每次迭代中for k = 1:size(A, 3) A2 = A(:, :, k); C2 = C(:, :, k); my_func = @(n)[zeros(size(B(:, :, A2(n)), 1), C2(n)), B(:, :, A2(n))]; Res(:,:,k) = cell2mat(arrayfun(my_func,reshape(1:numel(A2),size(A2)),'Un',0)) end 的大小不同,我建议您将Res作为单元格数组,

Res

P.S。
请注意,对于第二次迭代,您有Res{k} = cell2mat(arrayfun(my_func,reshape(1:numel(A2),size(A2)),'Un',0)) ,您将遇到问题,因为第二行不会与第一行具有相同的零数。我相信你的意思是这样的:C = [1, 0, 1, 0; 0, 1, 1, 1]

编辑#3:

这是生成随机矩阵C = [1, 1, 1, 0; 0, 1, 1, 1]的代码,其中每行总计为预定义的整数C(也可任意选择):

K