根据条件过滤 MATLAB 非数值数组数据
Filter MATLAB non-numerical array data based on criteria
两个问题,一个相当简单的问题(至少看起来应该很简单)和一个可能需要更多工作的问题。随时为其中一个或两个做出贡献。
首先,我想基于一个基于条件的现有字符串数组创建一个字符串数组。以双数组的类似操作为例:
>> nums = [ 1 2 1 2]
nums =
1 2 1 2
>> big_nums = (nums == 2) .* nums
big_nums =
0 2 0 2
我想用字符串数组做一些类似的事情,但是我不知道要使用什么函数:
>> sizes = ["XL" "L" "XL" "L"]
sizes =
1×4 string array
"XL" "L" "XL" "L"
>> large_sizes = (sizes == "L") .* sizes
Undefined operator '.*' for input arguments of type 'string'.
我希望输出为
large_sizes =
1×4 string array
"" "L" "" "L"
第二个问题。假设我有一个二维元胞数组。我想根据条件过滤数据:
>> data = {"winter", 1; "spring", 2; "summer", 3; "fall", 4}
data =
4×2 cell array
["winter"] [1]
["spring"] [2]
["summer"] [3]
["fall" ] [4]
>> nice_weather = ( (data(1,:) == "fall") + (data(1,:) == "spring") ) .* data
Error using ==
Cell must be a cell array of character vectors.
我想要一个生成两个数组之一的代码:
nice_weather =
4×2 cell array
[""] [1]
["spring"] [2]
[""] [3]
["fall"] [4]
----- 或 -----
nice_weather =
2×2 cell array
["spring"] [2]
["fall"] [4]
对于这个问题,我也愿意将数据分成多个数组(例如,一个数组用于字符串,一个数组用于数字)。
谢谢!
此解决方案使用 MATLAB 中的 strcmpi
函数(不需要工具箱)来比较两个字符串(不区分大小写)。
一维元胞数组:
sizes = {'XL' 'L' 'XL' 'L'}; % Changed " to ' & used cell array
idx = strcmpi(sizes,'L'); % Logical index
sizelist = {sizes{idx}}
或者你可以试试
sizes(~idx) = {"" ""} % manual just for example
为了自动调整空格数""
,你可以这样使用repmat
sizes(~idx) = repmat({""},1,sum(~idx))
输出:
sizes = 1×4 cell array
{[""]} {'L'} {[""]} {'L'}
二维元胞数组:
data = {'winter', 1; 'spring', 2; 'summer', 3; 'fall', 4}; % Changed " to '
nicemo1 = 'spring';
nicemo2 = 'fall';
idx = strcmpi(data(:,1),nicemo1) | strcmp(data(:,1),nicemo2); % Obtain logical index
data(idx,:)
输出:
ans = 2×2 cell array
{'spring'} {[2]}
{'fall' } {[4]}
使用 MATLAB R2018b 测试。
还要注意像 sizes
这样的变量,因为删除一个字母会掩盖一个有用的函数,size
.
两个问题,一个相当简单的问题(至少看起来应该很简单)和一个可能需要更多工作的问题。随时为其中一个或两个做出贡献。
首先,我想基于一个基于条件的现有字符串数组创建一个字符串数组。以双数组的类似操作为例:
>> nums = [ 1 2 1 2]
nums =
1 2 1 2
>> big_nums = (nums == 2) .* nums
big_nums =
0 2 0 2
我想用字符串数组做一些类似的事情,但是我不知道要使用什么函数:
>> sizes = ["XL" "L" "XL" "L"]
sizes =
1×4 string array
"XL" "L" "XL" "L"
>> large_sizes = (sizes == "L") .* sizes
Undefined operator '.*' for input arguments of type 'string'.
我希望输出为
large_sizes =
1×4 string array
"" "L" "" "L"
第二个问题。假设我有一个二维元胞数组。我想根据条件过滤数据:
>> data = {"winter", 1; "spring", 2; "summer", 3; "fall", 4}
data =
4×2 cell array
["winter"] [1]
["spring"] [2]
["summer"] [3]
["fall" ] [4]
>> nice_weather = ( (data(1,:) == "fall") + (data(1,:) == "spring") ) .* data
Error using ==
Cell must be a cell array of character vectors.
我想要一个生成两个数组之一的代码: nice_weather =
4×2 cell array
[""] [1]
["spring"] [2]
[""] [3]
["fall"] [4]
----- 或 -----
nice_weather =
2×2 cell array
["spring"] [2]
["fall"] [4]
对于这个问题,我也愿意将数据分成多个数组(例如,一个数组用于字符串,一个数组用于数字)。
谢谢!
此解决方案使用 MATLAB 中的 strcmpi
函数(不需要工具箱)来比较两个字符串(不区分大小写)。
一维元胞数组:
sizes = {'XL' 'L' 'XL' 'L'}; % Changed " to ' & used cell array
idx = strcmpi(sizes,'L'); % Logical index
sizelist = {sizes{idx}}
或者你可以试试
sizes(~idx) = {"" ""} % manual just for example
为了自动调整空格数""
,你可以这样使用repmat
sizes(~idx) = repmat({""},1,sum(~idx))
输出:
sizes = 1×4 cell array
{[""]} {'L'} {[""]} {'L'}
二维元胞数组:
data = {'winter', 1; 'spring', 2; 'summer', 3; 'fall', 4}; % Changed " to '
nicemo1 = 'spring';
nicemo2 = 'fall';
idx = strcmpi(data(:,1),nicemo1) | strcmp(data(:,1),nicemo2); % Obtain logical index
data(idx,:)
输出:
ans = 2×2 cell array
{'spring'} {[2]}
{'fall' } {[4]}
使用 MATLAB R2018b 测试。
还要注意像 sizes
这样的变量,因为删除一个字母会掩盖一个有用的函数,size
.