Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab:在某些条件下,将二维矩阵中的值插入三维矩阵_Matlab_Matrix_Vectorization - Fatal编程技术网

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

Matlab:在某些条件下,将二维矩阵中的值插入三维矩阵,matlab,matrix,vectorization,Matlab,Matrix,Vectorization,输出是一个3d矩阵,大小(输出)=[height width N],输入是一个2d矩阵,大小(输入)=[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 new_input=repmat(input,1,1,size(output,3

输出是一个3d矩阵,大小(输出)=[height width N],输入是一个2d矩阵,大小(输入)=[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
new_input=repmat(input,1,1,size(output,3));
output(output==0)=new_input(output==0);

您应该具有“cat”功能:
cat(3,matrix1,matrix2,…)
沿三维连接。

您应该具有“cat”功能:
cat(3,matrix1,matrix2,…)
沿着第三维度连接。

我希望“我需要实现”不是一个家庭作业

这里有一个解决方案,可以解决您的问题,虽然不是一条线

for k = 1:size(output,3)
    f = output(:,:,k);
    i_zero = (f==0);
    f(is_zero) = input(is_zero);
    output(:,:,k) = f;
end
new_input=repmat(input,1,1,size(output,3));
output(output==0)=new_input(output==0);
我希望“我需要实施”不是家庭作业

这里有一个解决方案,可以解决您的问题,虽然不是一条线

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

这是在一个班轮。。。但是使用未记录的
内置(''u paren',…
)为函数的输出下标引用

output(output==0)=builtin('_paren',repmat(input,[1,1,N]),output==0)
如果您希望将未记录的
内置
方法放在一行中,则该方法会变得混乱

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

…遗憾的是,我忘记了使用掩码和将两个矩阵相加是一个选项…

这里是一个单行程序…但是使用未记录的
内置(“\u paren”,…
为函数的输出下标引用

output(output==0)=builtin('_paren',repmat(input,[1,1,N]),output==0)
如果您希望将未记录的
内置
方法放在一行中,则该方法会变得混乱

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

…遗憾的是,我忘记了使用掩码和将两个矩阵相加是一个选项…

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

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

如果坚持使用单行解决方案,则
-1
+1
是为了避免索引
0

,您可以使用
(:)
操作符和
mod
命令:

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

其中
-1
+1
是为了避免索引
0

bsxfun
方法-

output = bsxfun(@times,output==0,input) + output
output = (output==0).*input(:,:,ones(1,N))+ output
替代方法-

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

bsxfun
进近-

output = bsxfun(@times,output==0,input) + output
output = (output==0).*input(:,:,ones(1,N))+ output
替代方法-

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

当与0进行精确比较时(根据OP要求),所有答案都可以解决问题,但为了通用化,如果您打算更改以进行另一次比较,请注意并非所有方法都以相同的方式工作。 示例如下:

代码:


当与0进行精确比较时(根据OP要求),所有答案都可以解决问题,但为了通用化,如果您打算更改以进行另一次比较,请注意并非所有方法都以相同的方式工作。 示例如下:

代码:



这与这个问题有什么关系?我正在试图避免循环,那么你有没有一种方法来实现上述不带循环的方法?那么,它必须在一行中还是不带循环?在下面的答案中已经提供了一个解决方案……我说的是,cat不会以任何方式解决代码。它只会连接矩阵。@ASantosRibeiro
cat
将通过
new_input=[]使用循环解决问题;对于k=1:size(输出,3)new_input=cat(3,new_input,输入);end
。但是我需要一个没有循环的解决方案。谢谢你的解决方案,这与这个问题有什么关系?我正在尝试避免循环,那么你有没有一种方法来实现上述没有循环的解决方案?那么,它必须在一行中还是没有循环?在下面的答案中已经提供了一个解决方案…我说的是cat没有解决方案e以任何方式显示代码。它只连接矩阵。@ASantosRibeiro
cat
将通过
new\u input=[]使用循环解决问题;对于k=1:size(output,3)new\u input=cat(3,new\u input,input);end
。但我需要一个不带循环的解决方案。谢谢你的解决方案。我一直在等待这个解决方案。:)这部分不是过时了吗:
*(output~=0)
?@DennisJaheruddin该死的,傻我,当然,你是对的!编辑,谢谢!!我认为这…更明智的方法…+1当然输入(:,:,一(1,N))
部分非常聪明。比
repmat
更容易编写,而且可能是fasterI在等待这一部分。:)这部分不是过时了吗:
*(输出=0)
?@DennisJaheruddin该死,愚蠢的我,当然,你是对的!编辑,谢谢!!我在想这个。。。更明智的方法+当然,
输入(:,:,one(1,N))
部分非常聪明。比
repmat
更容易编写,fasterI可能会建议使用
input
以外的变量名,因为它与具有相同名称的内置命令相匹配。感谢您的建议,无论如何,这是一个代码段,我没有在实际代码中使用它。我建议使用除
input
之外的变量名,因为它与具有相同名称的内置命令相匹配。感谢您的建议,无论如何,这是一个代码段,我没有在实际代码中使用它。是的。这是我建议的概括。很高兴看到,虽然我仍然不太熟悉内置函数虽然这只是一行而不是两行,但实际上我更喜欢@ASantosRibeiro给出的两行。@DennisJaheruddin我同意我几乎总是这样做,这不仅仅是一行,它更清晰,(这是我唯一一次真正认真地使用
内置函数)(“paren”…
正在创建匿名函数)是的。这是我建议的概括。很高兴看到,虽然我对内置函数还不是很熟悉。虽然这只是一行而不是两行,但我更喜欢@ASantosRibeiro@DennisJaheruddin。我同意我几乎总是这样做。这不仅仅是一行,它更易读,(我唯一一次真正认真地使用
内置函数(“\u paren”…
是创建匿名函数)谢谢,工作起来很有魅力,我向你保证这不是家庭作业,我只是在胡闹谢谢,工作起来很有魅力,我向你保证这不是家庭作业,我只是在胡闹,这可能是任何人身上的浮点错误