![](/img/trans.png)
[英]matlab, cell arrays, logical array indexing, and array type conversion
[英]Logical indexing of chars in heterogenous cell array in MATLAB
我有一個異類單元格數組,其中大多數包含數字,但只包含一列字符。 我想確定那些字符列中的值等於某個字符串'X'
。 我的數組看起來像這樣:
array_name = { [0] [2] 'X' ;
[4] [1] 'X' ;
[9] [7] 'A' ;
[9] [1] 'X' ;
[4] [4] 'B'};
我的問題有兩個:
(1)由於使用array_name == 'X'
不會返回在數值數組上使用時所期望的邏輯向量,我該怎么做?
(2)如何創建僅由滿足字符列中的值等於'X'
的條件的那些行組成的新數組,這樣我的輸出將如下所示:
new_array = { [0] [2] 'X' ;
[4] [1] 'X' ;
[9] [1] 'X'};
我只對(1)感興趣,因為我認為(2)是必要的。
任何提示,不勝感激!
將第三列作為逗號分隔的列表並將其連接到數組,然后可以使用邏輯索引:
L=[array_name{:,3}]=='X'
new_array=array_name(L,:)
另外,您可以使用strcmpi
來處理多個字符。
L=strcmpi(array_name(:,3),'X')
new_array=array_name(L,:)
抱歉,我不太理解您的第一個問題,但是下面是第二個問題的答案,我想也將回答第一個問題。
答案使用了正則表達式 ,它們提供的優勢是可以立即查看單元格數組,並在發生匹配時獲取邏輯值。
例:
clear
clc
array_name = { [0] [2] 'X';
[4] [1] 'X';
[9] [7] 'A' ;
[9] [1] 'X' ;
[4] [4] 'B'}
%// Check for string 'X' in the cell array.
FindX = regexp('X',array_name(:,end))
輸出是一個包含匹配邏輯索引的單元格:
FindX =
[1]
[1]
[]
[1]
[]
然后檢查非空單元格,即值為1的單元格; 一場比賽
Idx = ~cellfun(@isempty,FindX);
Idx =
1
1
0
1
0
然后,您可以對原始單元格數組使用邏輯索引:
OutRows = array_name(Idx,:)
OutRows =
[0] [2] 'X'
[4] [1] 'X'
[9] [1] 'X'
您可以使用以下事實: strcmp
可用於單元格數組,並且如果其參數之一不是字符串(以及字符串不同),則返回0
。 所以,
對於問題(1):
result1 = strcmp(array_name,'X');
在您的示例中,
result1 = 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0
對於問題(2):
result2 = array_name(strcmp(array_name(:,3),'X'),:);
這使
result2 = [0] [2] 'X' [4] [1] 'X' [9] [1] 'X'
這種方法的優點是,即使第3列不只包含字符串,它也可以工作。 例如,
array_name = { [0] [2] 'X' ;
[4] [1] 5 ;
[9] [7] 'A' ;
[9] [1] 'X' ;
[4] [4] 6 };
result1 =
0 0 1
0 0 0
0 0 0
0 0 1
0 0 0
result2 =
[0] [2] 'X'
[9] [1] 'X'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.