输出是一个带有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
答案 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,...)
沿第三维连接。