在不完整的矩形网格点列表上将矩阵设置为1

时间:2014-06-02 09:10:39

标签: matlab matrix coordinates

我在文本文件中有一组数据,显示大小为81x61的矩形网格的坐标。每行显示网格点的经度和纬度。经度从50.00变为80.00(61个值),纬度从30.00变为70.00(81个值),顺序如下:

50.00  30.00
51.50  30.00
52.00  30.00
.
.
.
79.50  30.00
80.00  30.00
50.00  31.00
50.50  31.00
51.00  31.00
.
.
.
79.00  70.00
79.50  70.00
80.00  70.00

我还有另一个文本文件,包含一些来自上面提到的矩形网格的随机坐标。

我想创建一个大小为81x61的矩阵,其元素为0和1,方式是1s对应于第二个文本文件的坐标。

如何编写在Matlab中执行此操作的代码?


我需要的小规模示例:

文字档案:

  1  1
  1  2
  1  3
  .
  .
  .
  4  3
  4  4
  4  5 

上述文本文件的对应矩形网格:

1,1  1,2  1,3  1,4  1,5
2,1  2,2  2,3  2,4  2,5
3,1  3,2  3,3  3,4  3,5
4,1  4,2  4,3  4,4  4,5

第二个文本文件:

1  1
1  3
2  4
2  5
3  4
4  1
4  5  

上述文本文件的对应矩阵:

1  0  1  0  0
0  0  0  1  1
0  0  0  1  0
1  0  0  0  1

3 个答案:

答案 0 :(得分:0)

我假设您的第一个文件中各个列中的minimummaximum值是纬度和经度范围。此外,在两个文件中,第一列是经度值。

 %// calculating the min and max of latitude and longitude 
 id1  = fopen('first_file.txt');
 A = fscanf(id1,'%f %f',[2 Inf]); 
 long_min = min(A(1,:));
 long_max = max(A(1,:));
 lat_min = min(A(2,:));
 lat_max = max(A(2,:));
 %// calculating output matrix size
 no_row = (lat_max-lat_min)*2+1;   
 no_col = (long_max-long_min)*2+1;
 output = zeros(no_row,no_col);

 id2  = fopen('second_file.txt');
 A = fscanf(id2,'%f %f',[2 Inf]);
 % // converting the values into corresponding indices
 A(1,:) = A(1,:) - long_min;     
 A(2,:) = A(2,:) - lat_min;   
 A = A*2 +1; 
 linear_ind = sub2ind([no_row no_col],A(2,:),A(1,:));
 output(linear_ind) = 1;

第二种方法 我假设在第二个文本文件中,第一列条目是纬度,第二列条目是经度。您必须对以下变量进行硬编码:

 long_min : the minimum value among longitude values
 lat_min : the minimum value among latitude values
 long_max : maximum value among longitude values
 lat_max : maximum value among latitude values

这是代码(仅考虑第二个文本文件)

 no_row = (lat_max-lat_min)*2+1;   
 no_col = (long_max-long_min)*2+1;
 output = zeros(no_row,no_col);
 id2  = fopen('second_file.txt');
 A = fscanf(id2,'%f %f',[2 Inf]);
 % // converting the values into corresponding indices
 A(1,:) = A(1,:) - long_min;     
 A(2,:) = A(2,:) - lat_min;   
 A = A*2 +1; 
 linear_ind = sub2ind([no_row no_col],A(2,:),A(1,:));
 output(linear_ind) = 1;

答案 1 :(得分:0)

  

我想创建一个大小为81x61的矩阵,其中元素为0和1   1s对应于第二个文本文件中坐标的方式。

这是问题中的相关信息。答案是Matlab函数sub2inddocumentation)。它将x,y坐标列表转换为数组索引列表,然后可以方便地将其设置为1。

假设您已经在名为second_file的Nx2矩阵中读取了第二个文件的内容,并且已经在变量matrix_size(81x61)中给出了结果矩阵的大小。然后你做:

x = second_file(:, 1);
y = second_file(:, 2);
result = zeros(matrix_size);
index = sub2ind(matrix_size, x, y);
result(index) = 1;

答案 2 :(得分:0)

我自己找到了办法;

假设:经度值中的最小值为50.00&纬度值中的最小值为30.00

%// First column of the files is Longitude and the second column is Latitude
  fr = fopen('second_file.txt','r');
  lon = textscan(fr,'%f %*[^\n]');
  lon = lon{:};
  fclose(fr);
  fr = fopen('second_file.txt','r');
  lat = textscan(fr,'%*f %f %*[^\n]');
  lat = lat{:};
  fclose(fr);
%// We know that the overall size of the target matrix is 81x61
  overall = zeros(81,61);
%// We assume that the total number of lines in the second file is 1000 (don't know if there is a built-in command to determine that!)
  for k = 1:1000
      i = int16(( lat(k) - 30.00 ) / 0.5 + 1);
      j = int16(( lon(k) - 50.00 ) / 0.5 + 1);
      overall(i,j) = 1;
  end