如何在matlab中使用'if'语句?
How to use the 'if' statement in matlab?
我有一个大小为 5x5 的元胞数组,如下所示
B= 00 10 11 10 11
01 01 01 01 11
10 00 01 00 01
10 10 01 01 11
10 10 10 00 10
和两个列向量
S1= 21
23
28
25
43
S2= 96
85
78
65
76
我想创建一个与 B 大小相同的新元胞数组,比如 5x5,使其满足以下条件
Final={S1 if B{i}=11
S1 if B{i}=10
S2 if B{i}=01
S2 if B{i}=00
所以最终的输出应该是这样的
Z = s2 s1 s1 s1 s1
s2 s2 s2 s2 s1
s1 s2 s2 s2 s2
s1 s1 s2 s2 s1
s1 s1 s1 s2 s1
ie Z= 96 21 21 21 21
85 85 85 85 23
28 78 78 78 78
25 25 65 65 25
43 43 43 76 43
我尝试使用 if 条件,但出现错误提示
'Error: The expression to the left of the equals sign is not a valid target for an assignment.'
for i=1:1:128
for j=1:1:16
if fs{i,j}=00
Z{i,j}=S1{i,j}
elseif fs{i,j}= 01
Z{i,j}=S2{i,j}
elseif fs{i,j}= 10
Z{i,j}=S1{i,j}
elseif fs{i,j}= 11
Z{i,j}=S2{i,j}
end
end
我想我在 if 语句和我正在使用的表达式中犯了一个错误。我哪里错了?请帮忙提前谢谢。
使用==
进行比较,=
进行赋值。所以if fs{i,j}==00
,等等
编辑:Matlab 确实是为高度矢量化的操作而设计的。与本机函数相比,嵌套循环速度较慢,通常可以用矢量化版本替换。您使用元胞数组而不是矩阵有什么特别的原因,尤其是当您只有数字数据时?
如果 B、S1 和 S2 是矩阵,您的代码可以写在一行高效的代码中,运行 会快得多:
Z = bsxfun(@times, S1, B == 11 | B == 10) + bsxfun(@times, S2, B == 01 | B == 0)
由于 B
是元胞数组,您需要使用 cell2mat
将其转换为矩阵,除非您想使用 cellfun
.
相反,您可以只调用 B_mat = cell2mat(B)
,然后调用 (B_mat>=10).*repmat(S1,1,5) + (B_mat<10).*repmat(S2,1,5)
。
您的元胞数组可能实际上包含二进制值,可能表示为字符串,在这种情况下,需要更改上面使用的条件。然后可能需要使用 cellfun
。
我有一个大小为 5x5 的元胞数组,如下所示
B= 00 10 11 10 11
01 01 01 01 11
10 00 01 00 01
10 10 01 01 11
10 10 10 00 10
和两个列向量
S1= 21
23
28
25
43
S2= 96
85
78
65
76
我想创建一个与 B 大小相同的新元胞数组,比如 5x5,使其满足以下条件
Final={S1 if B{i}=11
S1 if B{i}=10
S2 if B{i}=01
S2 if B{i}=00
所以最终的输出应该是这样的
Z = s2 s1 s1 s1 s1
s2 s2 s2 s2 s1
s1 s2 s2 s2 s2
s1 s1 s2 s2 s1
s1 s1 s1 s2 s1
ie Z= 96 21 21 21 21
85 85 85 85 23
28 78 78 78 78
25 25 65 65 25
43 43 43 76 43
我尝试使用 if 条件,但出现错误提示 'Error: The expression to the left of the equals sign is not a valid target for an assignment.'
for i=1:1:128
for j=1:1:16
if fs{i,j}=00
Z{i,j}=S1{i,j}
elseif fs{i,j}= 01
Z{i,j}=S2{i,j}
elseif fs{i,j}= 10
Z{i,j}=S1{i,j}
elseif fs{i,j}= 11
Z{i,j}=S2{i,j}
end
end
我想我在 if 语句和我正在使用的表达式中犯了一个错误。我哪里错了?请帮忙提前谢谢。
使用==
进行比较,=
进行赋值。所以if fs{i,j}==00
,等等
编辑:Matlab 确实是为高度矢量化的操作而设计的。与本机函数相比,嵌套循环速度较慢,通常可以用矢量化版本替换。您使用元胞数组而不是矩阵有什么特别的原因,尤其是当您只有数字数据时?
如果 B、S1 和 S2 是矩阵,您的代码可以写在一行高效的代码中,运行 会快得多:
Z = bsxfun(@times, S1, B == 11 | B == 10) + bsxfun(@times, S2, B == 01 | B == 0)
由于 B
是元胞数组,您需要使用 cell2mat
将其转换为矩阵,除非您想使用 cellfun
.
相反,您可以只调用 B_mat = cell2mat(B)
,然后调用 (B_mat>=10).*repmat(S1,1,5) + (B_mat<10).*repmat(S2,1,5)
。
您的元胞数组可能实际上包含二进制值,可能表示为字符串,在这种情况下,需要更改上面使用的条件。然后可能需要使用 cellfun
。