Please help me with the following problem:
In matlab, I have an Nx3 char variable, where N can vary depending on the input. Let's say N = 5 and I have the following variable A (5x3 char):
A = [' 1M';
' 5D';
'10Y';
'15W';
'20Y']
A总是Nx3,只能选择' D' W'' M',' Y',所以没有微秒。
有没有办法定义一个新变量B,其变量A中的数字为数值,以年为单位表示,即B = [1/12; 365分之5; 10; 15/52; 20]
到目前为止我尝试过的并且没有用(M的例子):
outc = mat2cell(A, ones(size(A,1),1), size(A,2));
for k = 1:length(outc)
if outc{k} = '\w*M'
outc{k} = strrep(outc, 'M', '');
outc2(k) = cellfun(@str2num, outc);
outc2(k) = outc2(k)./12;
end
end
Thank you for your help!
答案 0 :(得分:3)
您可以做的是设置一个将字符映射到数字的查找表。在您的情况下,您的查找表会将'D'
映射到365,'W'
映射到52,'M'
到12和'Y
' 1.您可以使用containers.Map
轻松完成此操作。具体来说,您可以设置它:
map = containers.Map({'D', 'W', 'M', 'Y'}, {365, 52, 12, 1});
这会将每个字符映射到我们谈到的每个数字。接下来,referencing your previous post,您将字符矩阵的每一行转换为单元格数组。但是,我也trim out any whitespace via strtrim
,以便我们的分析更容易:
B = mat2cell(A, ones(size(A,1),1));
B = strtrim(B); %// Trim out whitespace
现在,您所要做的就是遍历每个单元格,将之前的所有字符转换为数字,然后使用最后一个字符并引用我们的查找表来吐出正确的号码:
out = cellfun(@(x) str2num(x(1:end-1)) / map(x(end)), B);
我们得到:
out =
0.0833
0.0137
10.0000
0.2885
20.0000
在转换为浮点之前将其与小数形式的实际数字进行比较:
>> out2 = [1/12, 5/365, 10, 15/52, 20]
out2 =
0.0833 0.0137 10.0000 0.2885 20.0000
对我好看!
复制和粘贴:
A = [' 1M';
' 5D';
'10Y';
'15W';
'20Y'];
map = containers.Map({'D', 'W', 'M', 'Y'}, {365, 52, 12, 1});
B = mat2cell(A, ones(size(A,1),1));
B = strtrim(B); %// Trim out whitespace
out = cellfun(@(x) str2num(x(1:end-1)) / map(x(end)), B);
答案 1 :(得分:2)
这是一种类似于@rayryeng's的方法,但是使用正则表达式(regexprep
)而不是地图:
B = mat2cell(A, ones(size(A,1),1)); %// convert each line to a cell
B = regexprep(B, {'Y' 'M' 'W' 'D' }, {'' '/12' '/52' '/365'}); %// replace letters
B = cellfun(@str2num, B); %// convert from strings to numbers
有关
A = [' 1M';
' 5D';
'10Y';
'15W';
'20Y'];
这给出了
B =
0.0833
0.0137
10.0000
0.2885
20.0000