在 MATLAB 中使用 If 语句可能的向量化
Possible Vectorization using If Statements in MATLAB
假设我有以下列向量作为
res1 = -0.81 res2 = 0.61
0.1 -0.4
-0.91 0.62
0.2 -0.56
0.63 -0.72
我有两个固定常数D = 0.5
。现在假设 res1
的一个元素称为 X
,res2
的一个元素称为 Y
。我有以下条件
if (X > D && Y < -D)
output = 1
elseif (X < -D && Y > D)
output = -1
else
output = 0
end
我的问题是:
是否有可能 "vectorize" 这些条件迭代整个向量 res1
和 res2
,这样我的输出向量将给出 (例如) :
output = -1
0
-1
0
1
?
我知道我可以通过循环来完成,但我宁愿避免它,因为这些向量实际上非常大 (>10000)。我曾尝试使用逻辑索引,但无济于事(除非我实施错误)。
如有任何帮助,我们将不胜感激!
您可以使用logical arrays
来替换条件语句并使用适当的缩放因子缩放它们以获得最终输出-
%// Logical arrays corresponding to the IF and ELSEIF conditional statements
case1 = res1>D & res2<-D
case2 = res1<-D & res2>D
%// Get the final output after multiplying each case with the
%// scaling factors 1 and -1 respectively.
%// The default value of `zero` for the ELSE part is automatically taken
%// care of because we are using logical array of ones and zeros anyway
output = case1 + -1*case2 %// or simply case1 - case2
样本运行-
>> res1
res1 =
-0.8100
0.1000
-0.9100
0.2000
0.6300
>> res2
res2 =
0.6100
-0.4000
0.6200
-0.5600
-0.7200
>> output
output =
-1
0
-1
0
1
假设我有以下列向量作为
res1 = -0.81 res2 = 0.61
0.1 -0.4
-0.91 0.62
0.2 -0.56
0.63 -0.72
我有两个固定常数D = 0.5
。现在假设 res1
的一个元素称为 X
,res2
的一个元素称为 Y
。我有以下条件
if (X > D && Y < -D)
output = 1
elseif (X < -D && Y > D)
output = -1
else
output = 0
end
我的问题是:
是否有可能 "vectorize" 这些条件迭代整个向量 res1
和 res2
,这样我的输出向量将给出 (例如) :
output = -1
0
-1
0
1
?
我知道我可以通过循环来完成,但我宁愿避免它,因为这些向量实际上非常大 (>10000)。我曾尝试使用逻辑索引,但无济于事(除非我实施错误)。
如有任何帮助,我们将不胜感激!
您可以使用logical arrays
来替换条件语句并使用适当的缩放因子缩放它们以获得最终输出-
%// Logical arrays corresponding to the IF and ELSEIF conditional statements
case1 = res1>D & res2<-D
case2 = res1<-D & res2>D
%// Get the final output after multiplying each case with the
%// scaling factors 1 and -1 respectively.
%// The default value of `zero` for the ELSE part is automatically taken
%// care of because we are using logical array of ones and zeros anyway
output = case1 + -1*case2 %// or simply case1 - case2
样本运行-
>> res1
res1 =
-0.8100
0.1000
-0.9100
0.2000
0.6300
>> res2
res2 =
0.6100
-0.4000
0.6200
-0.5600
-0.7200
>> output
output =
-1
0
-1
0
1