Arrays 当NaN可以作为输入时,如何将matlab函数输入矢量化?

Arrays 当NaN可以作为输入时,如何将matlab函数输入矢量化?,arrays,matlab,performance,if-statement,vectorization,Arrays,Matlab,Performance,If Statement,Vectorization,我写了一个函数,我希望它能矢量化输入和输出: function output = myfunction(input1,input2) if input1 == 0 output = equation1 ; else output = equation2 ; end 我用input1=0和input1=0.5和myfunction测试了它input1和input2实际上是3D矩阵。我尝试进行更高效的计算,而不是逐元素运行循环计算 如果input1都是非零元素,myfunction

我写了一个函数,我希望它能矢量化输入和输出:

function output = myfunction(input1,input2)
if input1 == 0
    output = equation1 ;
else
    output = equation2 ;
end
我用
input1=0
input1=0.5
myfunction
测试了它
input1
input2
实际上是3D矩阵。我尝试进行更高效的计算,而不是逐元素运行循环计算

如果
input1
都是非零元素,
myfunction
工作正常。似乎一旦我输入了一个包含零和非零元素的矩阵,它就不能正确地通过
if语句。函数将为具有
input1==0
的元素提供NaN

如何更改它,使
myfunction
可以在
if语句中获取数字或矩阵

谢谢大家!

[编辑:]

实际函数如下所示:

function output = myfunction( input1 , frequency , input2 , input3 )

zero_ind = input1 == 0 ;
output = zeros(size(input1)) ;
output(zero_ind) = input3(zero_ind) / frequency ./ input2(zero_ind) ; ;
temp1(~zero_ind) = input1(~zero_ind) / frequency ;
temp2(~zero_ind) = input2(~zero_ind) * frequency ;
output(~zero_ind) = input3(~zero_ind) .*  ( 1 + temp1(~zero_ind)).^temp2(~zero_ind) .* temp1(~zero_ind) ./ ( ( 1 + temp1(~zero_ind) ).^temp2(~zero_ind) - 1 ) ;   

下面是一个矢量化的一般建议。应根据您的计算类型对其进行适当更改:

function output = myfunction(input1,input2)
zero_ind = input1==0; % this replaces the if statement
output = zeros(size(input1)); % initialize output to wanted size and shape
output(zero_ind) = input2(zero_ind).^2; % equation1
output(~zero_ind) = input1(~zero_ind).*input2(~zero_ind); % equation2
end
主要思想是使用而不是
if
语句。我在这里假设(除其他外,我猜)所有的输入和输出都是相同的大小。这可以放宽,但这取决于您所做的具体计算

编辑:

为了响应您使用real函数进行的编辑,下面是我的建议(我更改了输入名称,只是为了使其更加紧凑):


我所做的是计算所有的
输出
,就像在
in1
中没有零一样,然后只将
输出
中与
in1
中的零对应的位置替换为另一个值。这样,只有在必要时才使用
zero\u ind
,并最小化索引操作。

两个方程是否都使用
input1
input2
equation1
使用input2和
equation2
使用input1和input2。那会有什么不同吗?我不太清楚你想做什么。
all(input1(:)
是你要找的吗?我正试图解释清楚。您能告诉我哪里不懂吗?是的,我将输入变量调整为相同的大小,以避免使用我不太熟悉的bsxfun。我想这可能是一个可行的解决方案,但我的
方程2
可能需要使用
(~zero\u ind)
8次。它似乎占用了太多的内存,并有以下信息<代码>请求的249901x249901(465.3GB)阵列超过最大阵列大小首选项。创建大于此限制的数组可能需要很长时间,并导致MATLAB变得无响应。有关更多信息,请参阅数组大小限制或首选项面板。
@Ying首先,矢量化并不是一种神奇的方法,它需要大量内存才能加快速度。这是内存和速度之间的基本权衡。其次,我认为您可能以错误的方式处理此问题,可能是您应该熟悉
bsxfun
(自2016b以来隐式实现)。不管怎样,如果没有看到你的真实计算,我帮不了你更多的忙。你的问题太模糊了。谢谢你提到逻辑索引。这是一种在计算过程中占用大量内存的方法吗?它占用的内存与您的输入大小一样多,即使您多次使用它,也不会超过这个值。我正在编辑我的问题以反映原始代码。非常感谢。
function output = myfunction(in1,frequency,in2,in3)
temp1 = in1/frequency ;
temp2 = in2*frequency ;
output = in3.*(1+temp1).^temp2.*temp1./((1+temp1).^temp2-1);
zero_ind = in1 == 0;
output(zero_ind) = in3(zero_ind)./frequency./in2(zero_ind); 
end