如何在Matlab / Octave中过滤我的数字数组?

时间:2013-04-27 03:54:49

标签: matlab octave

我有一个非常简单的例子,我试图通过匹配字符串来过滤:

A = [0:1:999];
B = A(int2str(A) == '999');

这个

A(A > 990);

作品

int2str(5) == '5'

也有效

我只是想不通为什么我不能把两者放在一起。我收到有关不一致参数的错误。

3 个答案:

答案 0 :(得分:1)

int2str(A)生成一个非常长的char数组(大小为1 x 4996),其中包含端对端附加在一起的所有数字(包括间距)的字符串表示。

int2str(A) == '999'

因此,在上面的陈述中,您尝试将大小为1 x 4996的矩阵与另一个大小为1 x 3的矩阵进行比较。当然,这会失败,因为两者要么具有相同的大小,要么至少有一个需要是标量,在这种情况下标量扩展规则适用。

A(A > 990);

以上的工作原理是因为逻辑索引规则,结果将是A的索引中的元素,该条件适用于该条件。

int2str(5) == '5'

这仅适用,因为int2str调用的结果是1 x 1矩阵('5'),您将其与另一个相同大小的矩阵进行比较。试试int2str(555) == '55',它会因上述错误而失败。

我不确定您对原始陈述的期望结果,但也许您正在寻找:

A = [0:1:999];
B = int2str(A(A == 999))  % outputs '999'

答案 1 :(得分:0)

我不确定int2str()转换是您正在寻找的。 (另外,为什么需要将数字转换为字符串然后进行字符比较?)

假设你有一个更简单的案例:

A    = 1:3;
strA = int2str(A)
strA =
1  2  3

请注意,这是1x7字符数组。因此,将它与标量字符进行比较:

strA == '2'
ans =
     0     0     0     1     0     0     0

现在,您可能希望转置A并进行比较:

int2str(A')=='2'
ans =
     0
     1
     0

但是,如果每个数字的位数不相同,则此方法将不起作用,因为较低的数字将用空格填充(尝试创建A = 1:10并与'2'进行比较)。

然后,创建一个没有空格的字符串单元格数组,并使用strcmp()

csA = arrayfun(@int2str,A','un',0)
csA = 
    '1'
    '2'
    '3'

strcmp('2',csA)

答案 2 :(得分:0)

应该更快,并且将字符串转换为数字是正确的,而不是相反。尝试

B = A(A == str2double ('999'));