我想從 Matlab 中的單元格陣列中的字串中提取整數。每個字串包含 1 或 2 個整數,格式如下所示。每個數字可以是一位或兩位數字。我想將每個字串轉換為 1x2 陣列。如果字串中只有一個數字,則第二列應為 -1。如果有兩個數字,那么第一個條目應該是第一個數字,第二個條目應該是第二個數字。
'[1, 2]'
'[3]'
'[10, 3]'
'[1, 12]'
'[11, 12]'
非常感謝!
我嘗試了幾種不同的方法,但都沒有奏效。我認為我需要使用正則運算式并且很難找到正確的表達方式。
uj5u.com熱心網友回復:
您可以使用str2num將格式正確的字符(您似乎擁有)轉換為正確的陣列/標量。然后簡單地從元素填充end 1到第二個元素(注意這在已經有兩個元素的情況下什么都沒有)值-1。
這很明顯是在一個小回圈中完成的,詳情請參閱評論:
% Set up the input
c = { ...
'[1, 2]'
'[3]'
'[10, 3]'
'[1, 12]'
'[11, 12]'
};
n = cell(size(c)); % Initialise output
for ii = 1:numel(n) % Loop over chars in 'c'
n{ii} = str2num(c{ii}); % convert char to numeric array
n{ii}(end 1:2) = -1; % Extend (if needed) to 2 elements = -1
end
% (Optional) Convert from a cell to an Nx2 array
n = cell2mat(n);
如果你真的想使用正則運算式,你可以用類似的東西替換回圈部分:
n = regexp( c, '\d{1,2}', 'match' ); % Match between one and two digits
for ii = 1:numel(n)
n{ii} = str2double(n{ii}); % Convert cellstr of chars to arrays
n{ii}(end 1:2) = -1; % Pad to be at least 2 elements
end
但是有很多方法可以在不觸及正則運算式的情況下做到這一點,例如,您可以使用方括號,用逗號分隔,并根據每行中是否有逗號來erase填充。-1將所有內容包裝在一個更難閱讀(與回圈相比)cellfun中,然后你會得到一個單行:
n = cellfun( @(x) [str2double( strsplit( erase(x,{'[',']'}), ',' ) ), -1*ones(1,1-nnz(x==','))], c, 'uni', 0 );
為了便于閱讀和除錯,我推薦其中一個回圈。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/525546.html
下一篇:如何從元胞陣列生成字串
