矢量化代码中的Matlab调整
几天前,我发布了以下精彩的解决方案:矢量化代码中的Matlab调整,matlab,concatenation,vectorization,Matlab,Concatenation,Vectorization,几天前,我发布了以下精彩的解决方案: fid = fopen('C:\Testes_veloc\test.txt', 'Wt'); fmt = sprintf('%s;%d;%%d;%d;%d;%%d;%%d;%%d;%%.4f \\n',str1,num1,0,2) [a,b,c,d] = ndgrid(vect2,vect1,day,1:15); out = sprintf(fmt, [d(:), c(:), b(:), a(:), reshape(permute(MD,[2,1,3,4])
fid = fopen('C:\Testes_veloc\test.txt', 'Wt');
fmt = sprintf('%s;%d;%%d;%d;%d;%%d;%%d;%%d;%%.4f \\n',str1,num1,0,2)
[a,b,c,d] = ndgrid(vect2,vect1,day,1:15);
out = sprintf(fmt, [d(:), c(:), b(:), a(:), reshape(permute(MD,[2,1,3,4]),[],1)]');
fprintf(fid, '%s', out);
变量str1
,num1
,day
,vect1
,vect2
和MD
是此函数的输入:
是一个字符串1x1str1
是一个整数1x1num1
是一个向量10x1day
是一个向量7x1vect1
是一个向量180x1vect2
是一个4D矩阵(7x180x10x15)MD
result.txt:
RED;12;7;0;2;1;4;7;0.0140
RED;12;7;0;2;2;9;7;0.1484
RED;12;7;0;2;3;7;4;0.1787
RED;12;7;0;2;4;2;6;0.7891
RED;12;7;0;2;5;9;6;0.1160
RED;12;7;0;2;6;9;1;0.9893
但是,str1
不是1x1字符串;它是一个名称向量(189000x1),具有我想要的文本长度。换句话说,我有许多不同的其他字符串,而不仅仅是“RED”。是否有可能调整此矢量化循环以适应这种情况
我尝试了这个方法(将str1(:)添加到连接部分),但没有成功:
fmt = sprintf('%%s;%s;%d;%%d;%d;%d;%%d;%%d;%%d;%%.4f \\n',str1,num1,0,2)
out = sprintf(fmt, [str1 (:), d(:), c(:), b(:), a(:), reshape(permute(MD,[2,1,3,4]),[],1)]');
例如,str(1,:)=“RED”
<代码>str(2,:)=“FHAW”<代码>str(3,:)='KI81';像这样的细胞。
它无法将字符串连接到数字。有人有解决办法吗
提前感谢。sprintf(类似于fprintf)使用参数按照提供的顺序填充格式字段。如果提供的参数多于格式调用所需的参数,则这些函数会使用其他函数重复该格式:
sprintf('%s %i\n', 'a', 1, 'b', 2, 'c', 3)
% returns
ans =
a 1
b 2
c 3
使用Matlab的单元分解技术,您可以先准备参数,然后将其传递给sprintf:
tmp = {'a', 1, 'b', 2, 'c', 3};
sprintf('%s %i\n', tmp{:})
通过连接单元阵列,您可以获得更丰富的内容:
tmp1 = {'a','b','c'};
tmp2 = [1 2 3];
tmp = [tmp1' num2cell(tmp2')]'
sprintf('%s %i\n', tmp{:})
% Returns
tmp =
'a' 'b' 'c'
[1] [2] [3]
ans =
a 1
b 2
c 3
请注意,tmp的布局是格式中布局的转置。这是因为Matlab以行的主要顺序读取数据,所以它将逐行,然后是列,以获取sprintf的参数
fid = fopen('C:\Testes_veloc\test.txt', 'Wt');
fmt = sprintf('%%s;%d;%%d;%d;%d;%%d;%%d;%%d;%%.4f \\n',num1,0,2)
[a,b,c,d] = ndgrid(vect2,vect1,day,1:15);
tmp = [str(:) num2cell([d(:) c(:) b(:) a(:) reshape(permute(MD,[2,1,3,4]),[],1)]'])]';
fprintf(fid, fmt, tmp{:});
fclose(fid);
因此,在您的场景中,您需要使用参数创建一个大型单元数组,然后将其传递给sprintf
fid = fopen('C:\Testes_veloc\test.txt', 'Wt');
fmt = sprintf('%%s;%d;%%d;%d;%d;%%d;%%d;%%d;%%.4f \\n',num1,0,2)
[a,b,c,d] = ndgrid(vect2,vect1,day,1:15);
tmp = [str(:) num2cell([d(:) c(:) b(:) a(:) reshape(permute(MD,[2,1,3,4]),[],1)]'])]';
fprintf(fid, fmt, tmp{:});
fclose(fid);
请提供
名称的简短示例。解决方案可能不会比循环快。没有理由感到抱歉,我只是认为您可能已经有了代码片段,如果您直接进行比较,而不是我可能提供的一些通用反例,这将更有意义。此外,在前面的问题中,Floris提供了一个定时解决方案。你可以根据你的时间安排来调整。非常感谢。我现在无法测试它,但我会尽快尝试。我认为缺少一个括号,不是吗?删除代码中单独的括号(tmp
行的最后一个),我得到了以下错误:使用fprintf函数的错误没有为“cell”输入定义。
啊-我明白了。我会在我的回答中修正它。