Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
矢量化代码中的Matlab调整_Matlab_Concatenation_Vectorization - Fatal编程技术网

矢量化代码中的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
是此函数的输入:

  • str1
    是一个字符串1x1
  • num1
    是一个整数1x1
  • day
    是一个向量10x1
  • vect1
    是一个向量7x1
  • vect2
    是一个向量180x1
  • MD
    是一个4D矩阵(7x180x10x15)
目标是建立一个如下的文本文件:

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”输入定义。
啊-我明白了。我会在我的回答中修正它。