我正在做我的研究。我在编写代码来呈现以下矩阵时遇到了问题。
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
你的意见是什么?
首先,我不明白矩阵A
如何同时包含第一个A = [ 1 2 3 4; 3 2 1 4]
和A(1)
、A(2)
、A(3)
和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));
产生:
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
编辑#1:
在更新您的问题后,如果您有另一个矩阵C = [0, 0, 1, 2; 1, 1, 1, 0]
,它表示要在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))
这就产生了:
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
编辑#2:
在对您的问题进行第二次更新之后,如果您的A
和C
矩阵是三维的,这会给代码增加很多复杂性。我发现使用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
作为一个单元阵列,即:
Res{k} = cell2mat(arrayfun(my_func,reshape(1:numel(A2),size(A2)),'Un',0))
p.S.
请注意,对于C = [1, 0, 1, 0; 0, 1, 1, 1]
的第二次迭代,您将遇到一个问题,因为第二行的零数量与第一行不同。我相信你的意思是这样的:C = [1, 1, 1, 0; 0, 1, 1, 1]
。
编辑#3:
以下是生成随机矩阵C
的代码,其中每行加起来就是预定义的整数K
(也可以任意选择):
K = fix(size(A, 2) * (1 + rand)); %# Pick a random K
C = rand(size(A)); %# Generate a random C
C = ceil(C * K ./ repmat(sum(C, 2), 1, size(A, 2))) - 1; %# Normalize
C(:, end) = C(:, end) + K - sum(C, 2); %# Fix illegal rows