我有3个矩阵x,y和z,阶数为3 * 3。我想创建一个值为= 1./(x.^2+y.^2+z.^2)的新矩阵k if(x。^ 2 + y。^ 2 + z。^ 2> 1)和值= 0否则。 我想用这个:
k(x.^2+y.^2+z.^2>1)= 1./(x.^2+y.^2+z.^2)
但它给出错误:在赋值A(I)= B中,B和I中的元素数必须相同。 任何人都可以在一行中提供一个简单的解决方案,我不需要使用for循环
答案 0 :(得分:2)
我不确定你为什么要这样做,而不是把它分成两个操作。这样,您可以节省两次计算平方和的成本。
x = rand(3,3);
y = rand(3,3);
z = rand(3,3);
k = 1./(x.^2+y.^2+z.^2);
k(k>1)=0;
无论如何,另一种方法是使用功能编程原理:
x = rand(3,3);
y = rand(3,3);
z = rand(3,3);
myfun = @(x,y,z) 1/(x^2+y^2+z^2) * (x^2+y^2+z^2>1);
k = arrayfun(myfun, x, y, z);
或者,您可以将所有内容混合为一行:
k = arrayfun(@(x,y,z) 1/(x^2+y^2+z^2) * (x^2+y^2+z^2>1), x, y, z);
此代码的作用是将函数myfun
映射到每个数据元素。函数myfun
非常简单。它计算所需的数量,但将其与绑定条件相乘。但是,您可能需要beware。
编辑:解决评论。 如果您根本不想计算数量,我们可以使用条件匿名函数。有关详细信息,请参阅this guide。
iif = @(varargin) varargin{2 * find([varargin{1:2:end}], 1, 'first')}();
myfun = @(x,y,z) iif( x^2+y^2+z^2 <= 1, @() 0, x^2+y^2+z^2>1 ,@() 1/(x^2+y^2+z^2));
k = arrayfun(myfun, x, y, z);
答案 1 :(得分:0)
怎么样
k = x.^2+y.^2+z.^2;
k(k < 1) = 0;
k(k~= 0) = 1 ./ k(k~=0);
答案 2 :(得分:-1)
如果你试图节省一些处理时间(即,当它小于1时,不计算那些情况的平方和),那么几乎唯一的解决方案就是查表 否则,以下代码应该起作用
k=1./(x.^2+y.^2+z.^2)
k(k<=1)=0
你可以减少一些时间(假设x,y和z可能大于1)
idx0=x<1 & y<1 & z<1
k=zeros(3)
k(idx0)=1./(x(idx0).^2+y(idx0).^2+z(idx0)^2)
k(k<=1)=0
如果您将其更改为使用索引器,您的原始解决方案将起作用(我还没有对其进行分析,但我很确定它会花费更长时间,而不是我的:))
idx0=x.^2+y.^2+z.^2>1
k=zeros(3)
k(idx0)=1./(x(idx0).^2+y(idx0).^2+z(idx0)^2)