我有一个包含一组矩阵的特征值的单元格数组。我已从此数组中的每个单元格中删除了第一个值,并将它们放在矩阵中。然后通过基于水印图像的一组阈值来操纵这些值。然后我将值矩阵重新转换为单元格数组。我现在想将这些新单元格中的值放入旧数组中单元格的相应第一个位置。关于如何做到这一点的任何想法?我已经看到了很多基于规则进行搜索和替换的方法,但没有一种方法可以简单地进行一对一的替换。我只是希望这是可能的。
功能代码如下:(最后一行有麻烦)
function D = fun(D,W)
Q = 5;
[i,j] = size(D)
F = cellfun(@(c) c(1), D); % grab the first value from each cell
disp(F); % Debug check
for a = 1:i % Process the values
for b = 1:j
Z = mod(F(a,b),Q);
if W(a,b) == 0
if Z<(3*Q)/4;
F(a,b) = F(a,b)+Q/4-Z;
else
F(a,b) = F(a,b)+5*Q/4-Z;
end
else
if Z<Q/4;
F(a,b) = F(a,b)-Q/4+Z;
else
F(a,b) = F(a,b)+3*Q/4-Z;
end
end
end
end
disp(F); % Debug check
F = num2cell(F); % Make the new cell array
disp(F); % Debug Check
D{1,1} = cellfun(@(F) F{1,1}, F); % No clue what to do here
end
答案 0 :(得分:0)
在我看来,您想要实现的最简单的解决方案如下:
function D = fun(D,W)
Q = 5;
[i,j] = size(D)
F = cellfun(@(c) c(1), D); % grab the first value from each cell
disp(F); % Debug check
for a = 1:i % Process the values
for b = 1:j
Z = mod(F(a,b),Q);
if W(a,b) == 0
if Z<(3*Q)/4;
F(a,b) = F(a,b)+Q/4-Z;
else
F(a,b) = F(a,b)+5*Q/4-Z;
end
else
if Z<Q/4;
F(a,b) = F(a,b)-Q/4+Z;
else
F(a,b) = F(a,b)+3*Q/4-Z;
end
end
D{a,b}(1) = F(a,b)
end
end
end
所以我所做的就是将F(a,b)的值赋值给你操纵F的循环中D {a,b}的第一个元素 - 你可以这样做,因为F的元素无论如何都是独立的。
使用像cellfun
这样的matlab内置函数并不总是比显式循环更快。希望这会有所帮助。