簡體   English   中英

MATLAB中異構單元數組中字符的邏輯索引

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM