Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
Matlab 将矩阵中的每n行提取到循环中的另一个矩阵_Matlab_Loops_Matrix_Extract - Fatal编程技术网

Matlab 将矩阵中的每n行提取到循环中的另一个矩阵

Matlab 将矩阵中的每n行提取到循环中的另一个矩阵,matlab,loops,matrix,extract,Matlab,Loops,Matrix,Extract,我是matlab的初学者,目前正在编写一个脚本,用于从热成像视频中提取数据 首先,视频被分割成不同的帧。第一帧作为示例图片打开,以定义采样点的坐标。然后,目标是从一组帧中选择这些已定义坐标的rgb值,并将其保存到矩阵中 现在我有一个问题,将矩阵分解成n个较小的矩阵。 e、 g我将要选择的点数定义为n=2,图片计数为31。现在,它返回一个矩阵,表示62x3双矩阵中31张图片的rgb代码,每张图片有2个点 现在我想提取第1,第3,第5…等。。。行到新矩阵…这应该在循环中完成,根据n个点的数量…例如,

我是matlab的初学者,目前正在编写一个脚本,用于从热成像视频中提取数据

首先,视频被分割成不同的帧。第一帧作为示例图片打开,以定义采样点的坐标。然后,目标是从一组帧中选择这些已定义坐标的rgb值,并将其保存到矩阵中

现在我有一个问题,将矩阵分解成n个较小的矩阵。 e、 g我将要选择的点数定义为n=2,图片计数为31。现在,它返回一个矩阵,表示62x3双矩阵中31张图片的rgb代码,每张图片有2个点

现在我想提取第1,第3,第5…等。。。行到新矩阵…这应该在循环中完成,根据n个点的数量…例如,每张图片上的5个点等于5个矩阵,包含31张图片的值

这是我分析图片的代码摘录,它返回矩阵“值”

files = dir('*.jpg');
num_files = numel(files);

images = cell(1, num_files);
cal=imread(files(1).name);

n = input('number of selection points?: ');

imshow(cal);

[x,y] = ginput(n);

eval(get(1,'CloseRequestFcn'))

%# x = input('x-value?: ');   manual x selection
%# y = input('y-value?: ');   manual y selection

for k = 1:num_files
    images{k} = imread(files(k).name); 
end

matrix=cell2mat(images);
count=(0:size(matrix,1):size(matrix,1)*num_files);

for k = 1:num_files
    a(k)= mat2cell(impixel(matrix,x+count(k),y));
end

values = cat(1,a{:})
容易解决 你的意思是如果你有:

n = 2;
k = 2; % for example
matrix = [1 2 3;
          4 5 6;
          7 8 9;
          8 7 6];
你想让它变成

b{1} = [1 2 3;
        7 8 9];
b{2} = [4 5 6;
        8 7 6];
这可以通过以下方式轻松完成:

 for ii = 1:n
     b{ii} = matrix(1:n:end,:);
 end
更好的解决方案 当然,也可以重塑数据矩阵并使用它来代替较小的矩阵:(继续我的示例数据^^)

良好做法 或者,我更喜欢的选择是:以易于访问的方式立即保存数据。在这里,我认为它将是一个大小为:[num_文件x num_点x 3]的矩阵

如果您想要所有的第一点:

rgb_data(:,1,:)
只有这些点的红色通道:

rgb_data(:,1,1)
等等。 我认为这是可能的:

rgb_data = zeros(num_files, num_points, 3);
for kk = 1:num_files
    rgb_data(kk,:,:) = impixel(images{kk},x+count(k),y);
end
但是我不明白你的代码的全部含义(例如:为什么
matrix=cell2mat(images)
??当然还有:

count=(0:size(matrix,1):size(matrix,1)*num_files);
只是
count=0:num\u文件;

所以我不确定impix(矩阵,x+count(k),y)会产生什么结果,我使用了图像{k}:)

非常感谢您的努力,单元格是用正确的维度创建的,参数1:n:end,:听起来似乎有道理,但它只用第一个rgb值填充单元格数组……如果大小(矩阵)=[k*nx3],冒号运算符
应选择整行。如果你说不是(你说rgb值存储在行中),你应该检查
矩阵的大小
好的,对不起,我知道了,你的代码只引用每张图片中的第一个值,并将其复制到n的值,因为ii=1:n,所以对于n=4,它只是复制单元格4次,从第一行获取值,因为1:4:end=1是,更正您说过要将
矩阵中的数字分隔为不同的较小矩阵。您也可以使用b1、b2、b3、b4等。但是使用起来更容易,以后可以扩展到使用单元表示法:b{1}、b{2},等等。也许我是瞎子,但我不明白这是如何导致我得到一个单元数组的,它存储了b{1,1}中的第一个点,b{1,2}中的第二个点……很抱歉抱怨,我已经用这个部件两天了,仍然没有找到合适的解决方案。。编辑:伟大的重塑:)
count=(0:size(matrix,1):size(matrix,1)*num_files);