select selected numeber of rows from an huge array
2 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Damith
am 12 Mai 2014
Kommentiert: Damith
am 16 Mai 2014
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 Kommentare
Walter Roberson
am 12 Mai 2014
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?
Akzeptierte Antwort
per isakson
am 12 Mai 2014
Bearbeitet: per isakson
am 14 Mai 2014
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 Kommentare
per isakson
am 14 Mai 2014
@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
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu Logical finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!