我有一个6x7矩阵(A)和我正在做的一些操作k = 1:50(循环次数)。 我知道为了在excel文件中编写单个矩阵,我需要:
xlswrite('Filename.xls', A, 'A1')
如何在每个循环之后写入信息,以便每个循环从Excel中的位置A1 +((k-1)* 6 + 1)开始,并且我将所有Matrix(A)的结果列为一个在彼此之后。
谢谢!
答案 0 :(得分:3)
使用XLSWRITE函数时,您可以避免每次都计算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 Interop函数。
由于我上面提到的技巧现在不起作用,我将使用 "Calculate Excel Range" 函数来计算单元格范围(还有许多其他的FEX实现)。
以下是代码(重用previous answer中的一些代码):
%# 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();
事实上,我使用50次迭代运行两个版本,并将时间与TIC / TOC进行比较:
Elapsed time is 68.965848 seconds. %# calling XLSWRITE
Elapsed time is 2.221729 seconds. %# calling Excel COM directly
答案 1 :(得分:0)
我认为xlswrite
将覆盖现有文件,因此您最好收集所有数据,然后一次性写入。此外,一次性写入它将更快,因为它只涉及打开和关闭Excel一次。
但是,如果你真的想把它写成一个循环,那么下面应该有效(假设你的意思是下降):
range = sprintf('A%i:G%i', (k-1)*6+[1 6]);
xlswrite('Filename.xls', A, range);
请注意,如果A更改尺寸,则不会自动调整。