Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.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
每次循环后将信息写入Excel_Excel_Matlab_File Io_Matrix - Fatal编程技术网

每次循环后将信息写入Excel

每次循环后将信息写入Excel,excel,matlab,file-io,matrix,Excel,Matlab,File Io,Matrix,我有一个6x7矩阵(a)和一些我在它上面做的k=1:50(循环数)的运算。 我知道,为了在excel文件中编写单个矩阵,我需要: xlswrite('Filename.xls', A, 'A1') 如何在每个循环后写入信息,这样每个循环在Excel中的位置A1+((k-1)*6+1)处开始,并且我将矩阵(A)的所有结果一一列出 谢谢大家! 我认为xlswrite将覆盖现有文件,因此最好收集所有数据,然后一次性写入。而且,一次完成编写会更快,因为它只需要打开和关闭Excel一次 但是,如果您真的

我有一个6x7矩阵(a)和一些我在它上面做的k=1:50(循环数)的运算。 我知道,为了在excel文件中编写单个矩阵,我需要:

xlswrite('Filename.xls', A, 'A1')
如何在每个循环后写入信息,这样每个循环在Excel中的位置A1+((k-1)*6+1)处开始,并且我将矩阵(A)的所有结果一一列出


谢谢大家!

我认为
xlswrite
将覆盖现有文件,因此最好收集所有数据,然后一次性写入。而且,一次完成编写会更快,因为它只需要打开和关闭Excel一次

但是,如果您真的想将其写入循环中,则以下操作应该有效(假设您的意思是向下):

请注意,如果某个单元格的大小发生变化,这不会自动调整。

使用该函数时,您可以通过同时指定页码和范围来避免每次计算Excel单元格范围,其中范围仅给出第一个单元格的起始位置

如果矩阵在每次迭代中都改变大小,那么它尤其有用;我们只需取最后一个使用的单元格,并按矩阵的行数移动它

例如:

offset = 1;
for i=1:5
    %# generate different size matrices each loop
    A = ones(randi(4),randi(4)).*i;

    %# insert matrix in Excel inside the 1st sheet, starting at cell specifed
    xlswrite('filename.xls', A, 1, sprintf('A%d',offset));

    %# increment offset
    offset = offset + size(A,1);
end
这将创建包含以下内容的Excel文件:

1    1        
1    1        
1    1        
2    2    2    2
3    3
3    3
4            
4            
4            
4            
5    5    5    
5    5    5    
5    5    5    
5    5    5    
请注意,每次调用XLSWRITE时,都会建立到Excel的连接,然后关闭该连接。这有很大的开销

更好的方法是打开Excel一次,然后重复使用同一个会话来编写所有数据,然后在完成后关闭它。但是,您必须自己调用Office互操作功能

由于我上面提到的技巧现在不起作用,我将使用该函数来计算单元格范围(FEX还有许多其他实现)

下面是代码(重用a中的一些代码):

事实上,我用50次迭代运行了这两个版本,并将计时与TIC/TOC进行了比较:

Elapsed time is 68.965848 seconds.      %# calling XLSWRITE
Elapsed time is 2.221729 seconds.       %# calling Excel COM directly

??? 在输入数组的156维使用==>xlswrite时出错不能大于2。Error in==>Trois_3在77 xlswrite('MatlabExcel.csv',M,start)这是Matlab在我写你写的东西时报告的…这个错误消息意味着ndims(M)>2。我还检查了
xlswrite
命令的语法,并且范围规范不正确,所以我现在要更新它。请注意,代码是在循环内运行的。除了覆盖之外,您可能希望一次性写入,因为每次写入时都需要打开和关闭excel,这会在迭代中带来巨大的开销。同意。我将把它添加到答案中。我确信这应该会起作用,但这是我作为报告得到的结果:对于“char”类型的输入参数,未定义函数或方法“actxserver”。在9 Excel=actxserver('Excel.Application')中==>Deux_1出错;还有,我想提一下我有Macintosh,不知道这是否会影响程序@kojikurac:COM/ActiveX技术不适用于Mac,因此第二种解决方案仅适用于Windows。此外,根据以下页面,我认为XLSWRITE在Mac和Linux上使用CSV格式:。因此,要么在Windows计算机上运行代码,要么切换到另一种文件格式以导出数据(可能是简单的文本文件)…Buhu:(有没有其他方法可以使用这种文本格式以便Excel可以读取它们?@kojikurac:只需使用CSV文件,这些文件只是文本文件(每行上的值都是逗号分隔的),再加上Excel可以识别它们。您可以在此处搜索如何使用CSV的示例:
%# output file name
fName = fullfile(pwd, 'file.xls');

%# create Excel COM Server
Excel = actxserver('Excel.Application');
Excel.Visible = true;

%# delete existing file
if exist(fName, 'file'), delete(fName); end

%# create new XLS file
wb = Excel.Workbooks.Add();
wb.Sheets.Item(1).Activate();

%# iterations
offset = 0;
for i=1:50
    %# generate different size matrices each loop
    A = ones(randi(4),randi(4)).*i;

    %# calculate cell range to fit matrix (placed below previous one)
    cellRange = xlcalcrange('A1', offset,0, size(A,1),size(A,2));
    offset = offset + size(A,1);

    %# insert matrix in sheet
    Excel.Range(cellRange).Select();
    Excel.Selection.Value = num2cell(A);
end

%# save XLS file
wb.SaveAs(fName,1);
wb.Close(false);

%# close Excel
Excel.Quit();
Excel.delete();
Elapsed time is 68.965848 seconds.      %# calling XLSWRITE
Elapsed time is 2.221729 seconds.       %# calling Excel COM directly