select selected numeber of rows from an huge array
1 次查看(过去 30 天)
显示 更早的评论
Hi,
I need to select 365 (366,:) rows from array of [3652500 x 2] and write a matrix [366 x 10000]. Can somebody help me with that. I am new to MATLAB.
Thanks in advance.
5 个评论
Walter Roberson
2014-5-12
Your first dimension is being reduced by a factor of about 10000, but your second dimension is being increased by a factor of 5000 (10000 / 2). Where is the remaining data to go?
采纳的回答
per isakson
2014-5-12
编辑:per isakson
2014-5-14
There are a couple of magic numbers in your question. I guess it is the number of days in a year. "366" is leap year.
>> M = cssm;
>> whos M
returns
Name Size Bytes Class Attributes
M 366x10000 29280000 double
where
function M02 = cssm
N01 = 3652500;
N02 = 1e4;
M01 = randi( [1,17], [N01,2] );
M02 = nan( 366, N02 );
x01 = 1;
for jj = 1 : N02
if rem( jj, 4 ) >= 1
x02 = x01 + 365 - 1;
M02(1:365,jj) = M01( x01:x02, 1 );
x01 = x02+1;
else % leap year
x02 = x01 + 366 - 1;
M02(1:366,jj) = M01( x01:x02, 1 );
x01 = x02+1;
end
end
end
.
Comment: I chose to build the new array from the first column of your array. You can easily modify the code to use the second column or both.
.
Answer to comment:
I downloaded 0001.txt, but I still lack information
- What is the first column of whole numbers? It is not time information.
- Which of the first and second column shall be included in the result?
- There is no way to decide which data belongs to leap years.
Try
M02 = cssm;
whos M02
which returns
Name Size Bytes Class Attributes
M02 366x10000 29280000 double
where
function M02 = cssm( varargin )
narginchk( 0, 1 )
if nargin == 1
filespec = varargin{1};
else
filespec = 'h:\m\cssm\0001.txt';
end
fid = fopen( filespec, 'r' );
cac = textscan( fid, '%f%*f%*f%f' );
fclose( fid );
M01 = cat( 2, cac{:} );
M02 = cssm_( M01 );
end
function M02 = cssm_( M01 )
N02 = 1e4;
M02 = nan( 366, N02 );
x01 = 1;
for jj = 1 : N02
if rem( jj, 4 ) >= 1
x02 = x01 + 365 - 1;
M02(1:365,jj) = M01( x01:x02, 2 );
x01 = x02+1;
else % "leap" year
x02 = x01 + 366 - 1;
M02(1:366,jj) = M01( x01:x02, 2 );
x01 = x02+1;
end
end
end
6 个评论
per isakson
2014-5-14
@Damith, I added to the answer above. Use the debugging tools to analyze the behavior of the new function, cssm
Here are some links on debugging in Matlab
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Logical 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!