【发布时间】:2015-05-01 06:59:58
【问题描述】:
这可能是一个奇怪的问题,因为很多人会想知道为什么要使用像 bsxfun 这样复杂的函数来进行转置,而您有 .' 运算符。
但是,转置对我来说不是问题。我提出自己的问题并尝试使用特定函数来解决问题,以便了解该函数的实际工作原理。我尝试使用bsxfun 解决一些示例,并成功获得了预期的结果。但是当我尝试这个例子时,我的想法发生了变化,我已经理解了这个函数是如何工作的。
我拍摄的示例图像是方形 2D 图像,因此我不会尝试访问不可用的索引。
这是我的代码:
im = imread('cameraman.tif');
imshow(im);
[rows,cols] = size(im);
imout = bsxfun(@(r,c) im(c,r),(1:rows).',1:cols);
我遇到的错误:
使用 bsxfun 时出错
输出尺寸无效。测试错误(第 9 行)
imout = bsxfun(@(r,c) im(c,r),(1:rows).',1:cols);
PS: 我尝试在im( , ) 中交换r 和c(如下所示:bsxfun(@(r,c) im(r,c),(1:rows).',1:cols)),这没有造成任何错误,我得到的图像与输入。
我还尝试了使用循环和简单的转置使用 .' 运算符,效果很好。
这是我的循环代码:
imout(size(im)) = 0;
for i = 1:rows
for j = 1:cols
imout(i,j) = im(j,i);
end
end
我期待的答案是,我的代码有什么问题,错误意味着什么以及如何修改代码以使其正常工作。
【问题讨论】:
-
好问题。特别是为了正确提及
.'而不是':-) -
@LuisMendo 谢谢。我也做了一些测试并找到了解决方案。如果我错了,我希望你们能够验证并纠正:)
-
我不确定我是否理解您在回答中写的内容。
bsxfun执行单例扩展:它根据另一个数组中该维度的大小重复每个单例维度。这就是它的全部,我想 -
@LuisMendo,是的.. 文档说它实际上 沿该维度复制数组以匹配另一个数组。如果它实际上已复制,则大小会有所不同。
-
是的,对不起。复制只是从功能的角度来看。它实际上并没有被替换(那就是
repmat)
标签: image matlab matrix transpose bsxfun