我在文本文件中有一组数据,显示大小为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
答案 0 :(得分:0)
我假设您的第一个文件中各个列中的minimum
和maximum
值是纬度和经度范围。此外,在两个文件中,第一列是经度值。
%// 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函数sub2ind
(documentation)。它将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