Matlab:如何有选择地为矩阵赋值

时间:2014-03-16 16:56:01

标签: matlab matrix matlab-guide

我有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循环

3 个答案:

答案 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)