我是一个包含三维图像阵列列表的单元格。单元格是9个元素(图像)的向量,我想在第10个元素中存储一个新图像,其中每个像素对应于所有9个元素中相应像素的最大值。
让我们举一个简单的例子:
exports.app = functions.https.onRequest((request,response) => {
var listOfClasses = loadClassList().then(
//respond to the user
)};
function loadClassList() {
var dbRef = db.collection('playerCharacters');
var getClass = dbRef.get()
.then(
//do stuff with the queried data
)
};
如果I=imread('image.png');
V=zeros(size(I));
cel={I,2*I,V};
不是一个单元格而且它只是一个数组,我会像这样轻松地计算出最大值:
cel
。
所以我的问题是如果没有使用大量循环的细胞,我怎么能这样做?(可能?)?
修改!更多澄清:
我在一个像max(cel,[],3);
这样的单元格中,有9张图片(上面我只声明了一张,而我只用2 * I创建了第二张图像),每张图片都是RGB图像。 cel={I1,I2,I3,I4,I5,i6,i7,I8,i9};
图片将形成为9张图片的最大值,如下所示:I10
我想拍摄第一张图像的第一个像素和第二张图像的第一个像素......然后这些像素的最大值将对应于第10张图像的第一个像素。
答案 0 :(得分:1)
如果你想要的是一个像素的最大值,我认为最好的方法就是for循环。 例如
max_image = zeros(size(cel{1}));
for i = 1:size(cel,2)
max_image = max(cel{i}, max_image);
end
如果你真的不想使用for循环,你可以将单元格转换为4d数组或使用带累加器的递归函数,但我认为循环是最简单的解决方案。
答案 1 :(得分:0)
imread
的情景似乎不太明确。但是,您可以使用以下内容从名为cel
的单元格中的所有数组中获取所有最大值的最大值。
max(cellfun(@(arr)max(arr),cel));
根据我的经验(几乎没有使用过R2014a之后的任何内容),cellfun
,arrayfun
等确实比循环更快。但是,时间上只有一个恒定的差异。因此,使用这些函数主要使您更容易在特定场景中维护代码。他们在性能方面没有显着的优势。使用它们不与矢量化相同。
编辑:根据您的说明,如果您始终希望元素最多包含9个数组,则可以使用arrayfun
,如下所示。早期关于速度和使用的评论并没有改变。
arrayfun(@(p1,p2,p3,p4,p5,p6,p7,p8,p9)max(p1,p2,p3,p4,p5,p6,p7,p8,p9),cel{1},...,cel{9});
如果您的图片很大而且您正在处理大量图片,并且说您不能一次使用9个批次,那么您可能想要探索使用bsxfun
,高度优化。
elementwiseMax=bsxfun(@max,cel{1},cel{2});
for i=3:length(cel)
elementwiseMax=bsxfun(@max,elementwiseMax,cel{i});
end
如果您需要其他二进制函数而不是bsxfun
, max
仍然有效。这里的关键是避免在所有像素上循环,这很慢。
最后,如果您喜欢这种情况,仍然可以使用cellfun
替换循环。