我需要在数字向量和字符串向量之间切换:
@AfterReturning(value = "(* my.java.model.Triangle.myTest*(*)) && args(param)", returning = "returnedString", argNames = "param,returnedString")
public void afterReturningAdvice(String param, String returnedString) {
System.out.println("Executing after function advice that accepts the input " + param + " and returns " + returnedString);
}
我尝试a = [1, 2, 4, 5]
b = {'xx1', 'xx2', 'xx3', 'xx4'}
,但它返回strcat('XX', num2str(a))
,这不是我想要的。有人可以告诉我如何从XX1 2 3 4 5
创建b
以及如何从a
创建a
吗?谢谢!
答案 0 :(得分:3)
无需循环或cellfun
。让
a = [1, 2, 4, 15];
b = {'xx1', 'xx2', 'xx4', 'xx15'};
b
到a
使用格式说明符为a
的{{3}}将'%-i'
转换为字符串的单元格数组,以利用num2str
忽略尾随空格的事实;并在使用后者通过cellstr
连接后:
b_from_a = strcat('xx', cellstr(num2str(a(:), '%-i'))).';
a
到b
使用strcat
从每个字符串中删除xx
,然后应用strrep
:
a_from_b = str2double(strrep(b, 'xx', ''));
答案 1 :(得分:2)
B FROM A
我喜欢使用无证的Matlab函数,并且在这种情况下可以完美地运行:a = [1, 2, 4, 5];
b = sprintfc('xx%d',a)
b =
1×4 cell array
'xx1' 'xx2' 'xx4' 'xx5'
。它具有闪电般的速度,允许使用自定义格式将数字向量转换为字符数组的单元格向量:
b = {'xx1', 'xx2', 'xx3', 'xx4'};
a = str2double(strrep(b,'xx',''))
a =
1 2 3 4
A FROM B
使用替代品非常简单:
{{1}}
答案 2 :(得分:1)
如果您使用循环而不是矢量化函数打开,则可以相当轻松地完成。例如:
clc; clear;
a = [1, 2, 4, 5];
for i = 1:length(a)
b{i} = strcat('XX', num2str(a(i)));
end
b
返回
b =
1×4 cell array
{'XX1'} {'XX2'} {'XX4'} {'XX5'}
如果你想走另一条路,你可以这样做。
for i = 1:length(b)
c(i) = str2double(b{i}(3:end));
end
c
返回
c =
1 2 4 5
值得注意的是,更好的代码b
和c
都会pre-allocate。
答案 3 :(得分:0)
在16b中,MATLAB添加了一个新的字符串类,在17a中,您可以用双引号构造一个字符串。使用字符串,
"xx" + a
会给你想要的答案。以下是字符串与其他解决方案的性能比较:
>> profFunc
matlabbit solution: 0.29956
Luis Mendo solution: 15.2378
OmG solution 1: 41.0055
OmG solution 2: 29.1976
Tommaso Belluzzo solution: 1.3574
function profFunc
a = [1, 2, 4, 5];
n = 1E5;
tic;
for i = 1:n
ans = "xx" + a;
end
disp("matlabbit solution: " + toc);
tic;
for i = 1:n
ans = strcat('xx', cellstr(num2str(a(:), '%-i'))).';
end
disp("Luis Mendo solution: " + toc);
tic;
for i = 1:n
xxs = cell(1,4);
xxs(:) = {'XX'};
q = cell(1,4); q{1}=1;q{2}=2;q{3}=4;q{4}=5;
ans = cellfun(@(x,i) strcat(x, num2str(i)), xxs,q, 'UniformOutput', false);
end
disp("OmG solution 1: " + toc);
tic;
for i = 1:n
ans = cell(1,length(a));
for i = 1:length(a)
ans{i} = strcat('XX',num2str(a(i)));
end
end
disp("OmG solution 2: " + toc);
tic;
for i = 1:n
ans = sprintfc('xx%d',a);
end
disp("Tommaso Belluzzo solution: " + toc);
end