我在MATLAB中使用fprintf()函数遇到了一些意外行为。我正在尝试使用单元格数组和数字数组的内容打印多行文件。我知道我可以如下使用fprintf()函数来打印出单元格数组的内容:
myCellArray = {'one','two','three'};
fprintf('%s\n',myCellArray{:})
这将产生以下输出:
one
two
three
我还可以打印出如下数字数组:
myNumericalArray = [1,2,3];
fprintf('%i\n',myNumericalArray)
结果是:
1
2
3
但是,如果我尝试将它们混合使用,就会出现怪异的行为,如下所示:
fprintf('%s is %i\n',myCellArray{:},myNumericalArray)
结果是:
one is 116
wo is 116
hree is 1
我认为之所以会发生这种情况,是因为MATLAB尝试在myCellArray
的位置打印%i
中的下一个条目,而不是使用{{1}中的第一个条目}。如果我键入以下内容,这是显而易见的:
myNumericalArray
这将导致:
fprintf('%s %s\n',myCellArray{:},myCellArray{:})
...是否有某种方法可以确保每行仅使用每个数组中的一个元素?
答案 0 :(得分:3)
我同意你的想法。因此,我只能考虑通过使用两个初始数组中的交替值创建一个组合单元格数组来避免这种情况,请参见以下代码:
myCombinedArray = [myCellArray; mat2cell(myNumericalArray, 1, ones(1, numel(myNumericalArray)))];
fprintf('%s is %i\n', myCombinedArray{:})
给出(我假设)所需的输出:
one is 1
two is 2
three is 3
答案 1 :(得分:2)
fprintf(formatSpec,A1,...,An)
将按列顺序打印A1
的所有元素,然后按列顺序打印A2
的所有元素...和size(A1)
不一定等于size(A2)
。
因此,在您的情况下,最简单的解决方案是IMO for for循环:
for ii = 1:length(myCellArray)
fprintf('%s is %d\n',myCellArray{ii},myNumericalArray(ii))
end
为简单起见,foo(cell{:})
与splat运算符(python,ruby等...)相似,因此matlab将此命令解释为foo(cell{1},cell{2},...,cell{n})
,这就是为什么两个参数不被解释为对的原因-明智的。
答案 2 :(得分:1)
这类似于循环解决方案,但更紧凑:
arrayfun(@(c,n) fprintf('%s is %i\n', c{1}, n), myCellArray, myNumericalArray)