Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vector 为什么我会得到这个错误-MATLAB_Vector_Matlab - Fatal编程技术网

Vector 为什么我会得到这个错误-MATLAB

Vector 为什么我会得到这个错误-MATLAB,vector,matlab,Vector,Matlab,我有图像和向量 a = imread('Lena.tiff'); v = [0,2,5,8,10,12,15,20,25]; 这个M文件呢 function y = Funks(I, gama, c) [m n] = size(I); for i=1:m for j=1:n J(i, j) = (I(i, j) ^ gama) * c; end end y = J; imshow(y); 当我尝试这样做时: f = Funks(a,v,2) 我得到这个错误:

我有图像和向量

a = imread('Lena.tiff');
v = [0,2,5,8,10,12,15,20,25];
这个M文件呢

function y = Funks(I, gama, c)
[m n] = size(I);
for i=1:m
    for j=1:n
        J(i, j) = (I(i, j) ^ gama) * c;
    end
end
y = J;
imshow(y);
当我尝试这样做时:

f = Funks(a,v,2)
我得到这个错误:

??? Error using ==> mpower
Integers can only be combined with integers of the same class, or scalar doubles.

Error in ==> Funks at 5
        J(i, j) = (I(i, j) ^ gama) * c;

有人能帮我吗

该错误是由于您试图将一个数字提升为向量幂而导致的。转换后(即在函数调用中用实际参数替换形式参数),类似于:

J(i, j) = (a(i, j) ^ [0,2,5,8,10,12,15,20,25]) * 2
元素级power
^
也不起作用,因为您将尝试将向量“固定”到标量容器中

稍后编辑:如果要将每个gamma应用于图像,可能此循环更直观(尽管不是最有效的):

或者你也可以看看这里发布的其他解决方案(如果不清楚的话,可能会更有效)


稍后(呃?)编辑:如果您的tiff文件是CYMK,则
imread
的结果是一个颜色矩阵,必须以与通常不同的方式处理(因为它是三维的)。

您试图做的在数学上没有意义。您正在尝试将一个向量指定给一个数字。你的问题不是MATLAB编程,而是你要做什么的定义

如果您试图生成多个图像
J
,每个图像对应于应用于该图像的某个
伽马
,则应按以下步骤执行:

function J = Funks(I, gama, c)
[m n] = size(I);

% get the number of images to produce
k = length(gama);

% Pre-allocate the output
J = zeros(m,n,k);

for i=1:m
    for j=1:n
        J(i, j, :) = (I(i, j) .^ gama) * c;
    end
end
最后,您将获得图像
J(:,:,1)
J(:,:,2)
,等等


如果这不是你想做的,那么先算出你的方程式。

我有两种方法:

1)
arrayfun

results = arrayfun(@(i) I(:).^gama(i)*c,1:numel(gama),'UniformOutput',false);
J = cellfun(@(x) reshape(x,size(I)),results,'UniformOutput',false);
results = bsxfun(@power,I(:),gama)*c;
results = num2cell(results,1);
J = cellfun(@(x) reshape(x,size(I)),results,'UniformOutput',false);
2)
bsxfun

results = arrayfun(@(i) I(:).^gama(i)*c,1:numel(gama),'UniformOutput',false);
J = cellfun(@(x) reshape(x,size(I)),results,'UniformOutput',false);
results = bsxfun(@power,I(:),gama)*c;
results = num2cell(results,1);
J = cellfun(@(x) reshape(x,size(I)),results,'UniformOutput',false);

在给出解决方案之前,我需要知道您的代码应该做什么。到目前为止我还没弄明白;我刚刚找到了错误的来源。:-)那么,让我再问你:你函数的预期结果是什么?我有一个输入图像a,其中我必须用公式J=c*a^gamma计算输出图像,对于gamma=0,2,5,8,10,12,15,20,25和c=const,声子的解可能适合你。或者,如果您觉得它更简单、更容易(我知道Matlab的神会惩罚我推荐这个…),您只需为创建一个循环,该循环遍历您的gamma值,并在每次函数失效时调用。我将把代码添加到我的初始注释中,好吗?Phenon的解决方案已经把我带到了另一个错误???错误使用==>幂整数只能与同一类的整数或标量双精度整数组合。在13 J(i,J,:)=(i(i,J)时出现错误==>Funksioni2。^gama)*2;好的,不要惊慌,让我们一步一步来。这个函数Funksioni2是什么?我以前没见过。这是你把Phenon的代码放进去的函数的新版本吗?我必须写一个运算,取输入图像a,然后用公式J=c*a^gamma计算输出图像,对于gamma=0,2,5,8,10,12,15,20,25和c=const?它看起来很吓人,对我来说很高级。对不起,o。O@user2287999当前位置这不是两个中的任何一个。它在做其他两个SO同伴建议的事情。???未定义的命令/函数“bsxfun”???未定义的命令/函数“arrayfun”。我是这样做的!!函数y=Det(I,gama,c)[mn]=size(I);对于i=1:m对于j=1:n结果=bsxfun(@power,i(:),gama)*c;结果=num2单元(结果,1);J=cellfun(@(x)重塑(x,大小(I)),结果,'UniformOutput',假);端y=J;你不必做任何循环。这几行(其中一种方法)已经完成了您需要的所有工作,避免了直接调用循环。顺便问一下,为什么不定义bsxfun和arrayfun?它们内置于Matlab函数中!