Matlab:在某些条件下将二维矩阵中的值插入三维矩阵

时间:2014-06-04 12:40:33

标签: matlab matrix vectorization

输出是一个带有size(output) == [height width N]的3d矩阵,输入是带有size(input) == [height width]的二维矩阵。我需要在一行中实现以下代码。

for k = 1:size(output,3)
    f = output(:,:,k);
    i_zero = (f==0);
    f(is_zero) = input(is_zero);
    output(:,:,k) = f;
end

6 个答案:

答案 0 :(得分:5)

bsxfun方法 -

output = bsxfun(@times,output==0,input) + output

替代方法 -

output = (output==0).*input(:,:,ones(1,N))+ output

答案 1 :(得分:3)

我希望“我需要实施”不是一个功课。

这里有一个解决方案可以解决你的问题,虽然不是一行。

new_input=repmat(input,1,1,size(output,3));
output(output==0)=new_input(output==0);

答案 2 :(得分:1)

这是一个单行...但使用未记录的builtin('_paren',...下标引用函数的输出

output(output==0)=builtin('_paren',repmat(input,[1,1,N]),output==0)

没有未记录的builtin如果你想把它放在一行中,这个方法会变得混乱......

output=subsasgn(output,struct('type','()','subs',{{output==0}}),...
    subsref(repmat(input,[1,1,N]),struct('type','()','subs',{{output==0}})))

......遗憾的是我忘了使用面具并将两个矩阵加在一起是个选择...

答案 3 :(得分:1)

如果您坚持使用单行解决方案,则可以使用(:)运算符和mod命令:

output(output(:)==0) = input(mod(find(output(:)==0)-1,height*width)+1)    

-1+1的位置是为了避免索引0

答案 4 :(得分:1)

当与0进行精确比较时(如需要OP),所有答案都可以解决问题,但为了概括起见,如果您想要进行另一次比较,请注意并非所有方法都以相同的方式工作。 示例如下:

CODE:

%Simulation
output=rand(10,10,3);
input=rand(10,10);
% output=randi(9,10,10,3);
% input=randi(9,10,10);

%OP code
output2=[]
for k = 1:size(output,3)
    f = output(:,:,k);
    i_zero = (f<0.5);
    f(i_zero) = input(i_zero);
    output2(:,:,k) = f;
end

%repmat code
output3=output;
new_input=repmat(input,1,1,size(output,3));
output3(output<0.5)=new_input(output<0.5);
any(output2(:)-output3(:))

%bsxfun code
output4 = bsxfun(@times,output<0.5,input) + output;
any(output2(:)-output4(:))

%other variation code
output5 = (output<0.5).*input(:,:,ones(1,size(output,3)))+ output;
any(output2(:)-output5(:))

% bultin code
output6=output;
output6(output<0.5)=builtin('_paren',repmat(input,[1,1,size(output,3)]),output<0.5);
any(output2(:)-output6(:))

'-----'
any(abs(output2(:)-output3(:))>eps)
any(abs(output2(:)-output4(:))>eps)
any(abs(output2(:)-output5(:))>eps)
any(abs(output2(:)-output6(:))>eps)

'-----'
sum(abs(output2(:)-output3(:)))
sum(abs(output2(:)-output4(:)))
sum(abs(output2(:)-output5(:)))
sum(abs(output2(:)-output6(:)))

输出:

ans =

     0


ans =

     1


ans =

     1


ans =

     0


-----


ans =

     0


ans =

     1


ans =

     1


ans =

     0


-----


ans =

     0


ans =

  150.5088


ans =

  150.5088


ans =

     0

答案 5 :(得分:-3)

你应该拥有“猫”和“猫”。功能: http://www.mathworks.nl/help/matlab/ref/cat.html cat(3,matrix1,matrix2,...)沿第三维连接。