Matlab/CUDA:海浪模拟

2023-11-24

我学过《模拟海水》Jerry Tessendorf 的文章并尝试对统计波模型进行编程,但我没有得到正确的结果,我不明白为什么。

In my program I tried only to create a wave height field at time t = 0 without any further changes in time. After execution of my program I got not what I was expecting:enter image description here

这是我的源代码:

clear all; close all; clc;
rng(11); % setting seed for random numbers

meshSize = 64; % field size
windDir = [1, 0]; % ||windDir|| = 1
patchSize = 64;
A = 1e+4;
g = 9.81; % gravitational constant
windSpeed = 1e+2;

x1 = linspace(-10, 10, meshSize+1); x = x1(1:meshSize);
y1 = linspace(-10, 10, meshSize+1); y = y1(1:meshSize);
[X,Y] = meshgrid(x, y);

H0 = zeros(size(X)); % height field at time t = 0

for i = 1:meshSize
    for j = 1:meshSize
        kx = 2.0 * pi / patchSize * (-meshSize / 2.0 + x(i)); % = 2*pi*n / Lx
        ky = 2.0 * pi / patchSize * (-meshSize / 2.0 + y(j)); % = 2*pi*m / Ly
        P = phillips(kx, ky, windDir, windSpeed, A, g); % phillips spectrum
        H0(i,j) = 1/sqrt(2) * (randn(1) + 1i * randn(1)) * sqrt(P);
    end
end

H0 = H0 + conj(H0);

surf(X,Y,abs(ifft(H0)));
axis([-10 10 -10 10 -10 10]);

And the phillips功能:

function P = phillips(kx, ky, windDir, windSpeed, A, g)
    k_sq = kx^2 + ky^2;
    L = windSpeed^2 / g;
    k = [kx, ky] / sqrt(k_sq);
    wk = k(1) * windDir(1) + k(2) * windDir(2);
    P = A / k_sq^2 * exp(-1.0 / (k_sq * L^2)) * wk^2;
end

有没有任何matlab海洋模拟源代码可以帮助我理解我的错误?快速谷歌搜索没有得到任何结果。


Here's a "correct" result I got from "CUDA FFT Ocean Simulation". I didn't achieve this behavior in Matlab yet but I've ploted "surf" in matlab using data from "CUDA FFT Ocean Simulation". Here's what it looks like: enter image description here enter image description here


我做了一个实验并得到了一个有趣的结果:

我已经生成了h0来自“CUDA FFT 海洋模拟”。所以我必须做 ifft 从频域转换到空间域来绘制图表。我也做过同样的事h0使用matlabifft并使用cufftExecC2C来自 CUDA 库。结果如下:

CUDA ifft: enter image description here

Matlab ifft: enter image description here

要么我不明白实现的某些方面cufftExecC2C or cufftExecC2C和matlab ifft是不同的算法,有不同的结果。


顺便说一下,生成这样的表面的参数是:

  • 网格尺寸 = 32

  • A = 1e-7

  • 补丁大小 = 80

  • 风速 = 10


嗯,这绝对是一个有趣的练习。这是一个完全重写的答案,因为您自己发现了您所问的问题。

不要删除我的答案,发帖来帮助您矢量化和/或解释一些代码仍然是有价值的。

我完全重写了我在之前的答案中给出的 GUI,以便合并您的更改并添加几个选项。它开始长出胳膊和腿,所以我不会把清单放在这里,但你可以在那里找到完整的文件:

ocean_simulator.m.

这是完全独立的,它包括我矢量化并在下面单独列出的所有计算函数。


GUI 将允许您使用参数、设置波浪动画、导出 GIF 文件(以及一些其他选项,如“预设”,但它们还没有解决)。以下是您可以实现的目标的几个示例:


Basic

这就是您通过快速默认设置和几个渲染选项获得的效果。它使用较小的网格尺寸和快速的时间步长,因此它在任何机器上运行得都非常快。

water1


我家里条件有限(Pentium E2200 32bit),所以只能用有限的设置进行练习。即使设置达到最大,图形用户界面也会运行,但真正享受起来会变得很慢。

然而,随着快速运行ocean_simulator在上班 (I7 64 位、8 核、16GB 内存、Raid 中的 2xSSD),这让它变得更有趣!这里有一些例子:

Although done on a much better machine, I didn't use any parallel functionality nor any GPU calculations, so Matlab was only using a portion of these specs, which means it could probably run just as good on any 64bit system with decent RAM


风湖

This is a rather flat water surface like a lake. Even high winds do not produce high amplitude waves (but still a lot of mini wavelets). If you're a wind surfer looking at that from your window on top of the hill, your heart is going to skip a beat and your next move is to call Dave "Man! gear up. Meet you in five on the water!" water2


Swell

This is you looking from the bridge of your boat on the morning, after having battled with the storm all night. The storm has dissipated and the long large waves are the last witness of what was definitely a shaky night (people with sailing experience will know ...). Swell


T-Storm

And this was what you were up to the night before... T-Storm T-Storm3 second gif done at home, hence the lack of detail ... sorry


至底部:

最后,图形用户界面将允许您在水域周围添加补丁。在 GUI 中它是透明的,因此您可以添加水下物体或漂亮的海底。不幸的是,GIF 格式不能包含 Alpha 通道,因此这里没有透明度(但如果您导出为视频,那么应该没问题)。

Moreover, the export to GIF degrade the image, the joint between the domain border and the water surface is flawless if you run that in Matlab. In some case it also make Matlab degrade the rendering of the lighting, so this is definitely not the best option for export, but it allows more things to play within matlab. bottom


现在进入代码:

我不会列出完整的 GUI,这将是超长的(这篇文章已经足够长了),我将在这里列出重写的版本your代码,并解释更改。

您应该注意到,由于剩余的矢量化,执行速度大幅提高(数量级),但主要有两个原因:
(i) 重复进行大量计算。缓存值并重用它们比在循环中重新计算完整矩阵(在动画部分期间)要快得多。
(ii) 注意我如何定义表面图形对象。它仅定义一次(甚至为空),然后所有进一步的调用(在循环中)仅更新底层ZData表面对象的(而不是在每次迭代时重新创建表面对象。

开始:

%% // clear workspace
clear all; close all; clc;

%% // Default parameters
param.meshsize  = 128 ;     %// main grid size
param.patchsize = 200 ;     
param.windSpeed = 100  ;    %// what unit ? [m/s] ??
param.winddir   = 90   ;    %// Azimuth
param.rng = 13 ;            %// setting seed for random numbers
param.A         = 1e-7 ;    %// Scaling factor
param.g         = 9.81 ;    %// gravitational constant

param.xLim = [-10 10] ;     %// domain limits X
param.yLim = [-10 10] ;     %// domain limits Y
param.zLim = [-1e-4 1e-4]*2 ;

gridSize = param.meshsize * [1 1] ;

%% // Define the grid X-Y domain
x = linspace( param.xLim(1) , param.xLim(2) , param.meshsize ) ;
y = linspace( param.yLim(1) , param.yLim(2) , param.meshsize ) ;
[X,Y] = meshgrid(x, y);

%% // get the grid parameters which remain constants (not time dependent)
[H0, W, Grid_Sign] =  initialize_wave( param ) ;

%% // calculate wave at t0
t0 = 0 ;
Z = calc_wave( H0 , W , t0 , Grid_Sign ) ;

%% // populate the display panel
h.fig  = figure('Color','w') ;
h.ax   = handle(axes) ;                 %// create an empty axes that fills the figure
h.surf = handle( surf( NaN(2) ) ) ;     %// create an empty "surface" object

%% // Display the initial wave surface
set( h.surf , 'XData',X , 'YData',Y , 'ZData',Z )
set( h.ax   , 'XLim',param.xLim , 'YLim',param.yLim , 'ZLim',param.zLim )

%% // Change some rendering options
axis off                                %// make the axis grid and border invisible
shading interp                          %// improve shading (remove "faceted" effect)
blue = linspace(0.4, 1.0, 25).' ; cmap = [blue*0, blue*0, blue]; %'// create blue colormap
colormap(cmap)
%// configure lighting
h.light_handle = lightangle(-45,30) ;   %// add a light source
set(h.surf,'FaceLighting','phong','AmbientStrength',.3,'DiffuseStrength',.8,'SpecularStrength',.9,'SpecularExponent',25,'BackFaceLighting','unlit')

%% // Animate
view(75,55) %// no need to reset the view inside the loop ;)

timeStep = 1./25 ;
nSteps = 2000 ;
for time = (1:nSteps)*timeStep    
    %// update wave surface
    Z = calc_wave( H0,W,time,Grid_Sign ) ;
    h.surf.ZData = Z ;
    pause(0.001);
end


%% // This block of code is only if you want to generate a GIF file
%// be carefull on how many frames you put there, the size of the GIF can
%// quickly grow out of proportion ;)

nFrame = 55 ;
gifFileName = 'MyDancingWaves.gif' ;

view(-70,40)
clear im
f = getframe;
[im,map] = rgb2ind(f.cdata,256,'nodither');
im(1,1,1,20) = 0;
iframe = 0 ;
for time = (1:nFrame)*.5
    %// update wave surface
    Z = calc_wave( H0,W,time,Grid_Sign ) ;
    h.surf.ZData = Z ;
    pause(0.001);

    f = getframe;
    iframe= iframe+1 ;
    im(:,:,1,iframe) = rgb2ind(f.cdata,map,'nodither');
end
imwrite(im,map,gifFileName,'DelayTime',0,'LoopCount',inf)
disp([num2str(nFrame) ' frames written in file: ' gifFileName])

您会注意到我更改了一些内容,但我可以向您保证计算结果完全相同。此代码调用了一些子函数,但它们都是矢量化的,因此如果您愿意,您可以将它们复制/粘贴到此处并内联运行所有内容。


第一个调用的函数是initialize_wave.m 这里计算的所有内容稍后都将保持不变(当您稍后为波浪设置动画时,它不会随时间变化),因此将其单独放入一个块中是有意义的。

function [H0, W, Grid_Sign] =  initialize_wave( param )
% function [H0, W, Grid_Sign] =  initialize_wave( param )
%
% This function return the wave height coefficients H0 and W for the
% parameters given in input. These coefficients are constants for a given
% set of input parameters.
% Third output parameter is optional (easy to recalculate anyway)

rng(param.rng);  %// setting seed for random numbers

gridSize = param.meshsize * [1 1] ;

meshLim = pi * param.meshsize / param.patchsize ;
N = linspace(-meshLim , meshLim , param.meshsize ) ;
M = linspace(-meshLim , meshLim , param.meshsize ) ;
[Kx,Ky] = meshgrid(N,M) ;

K = sqrt(Kx.^2 + Ky.^2);    %// ||K||
W = sqrt(K .* param.g);     %// deep water frequencies (empirical parameter)

[windx , windy] = pol2cart( deg2rad(param.winddir) , 1) ;

P = phillips(Kx, Ky, [windx , windy], param.windSpeed, param.A, param.g) ;
H0 = 1/sqrt(2) .* (randn(gridSize) + 1i .* randn(gridSize)) .* sqrt(P); % height field at time t = 0

if nargout == 3
    Grid_Sign = signGrid( param.meshsize ) ;
end

请注意,初始winDir参数现在用表示“方位角”的单个标量值表示(以度为单位)的风(从 0 到 360 的任何值)。后来被翻译成它的X and Y组件由于功能pol2cart.

[windx , windy] = pol2cart( deg2rad(param.winddir) , 1) ;

这确保了规范始终是1.

该函数调用您有问题的phillips.m分开,但正如之前所说,它甚至可以完全矢量化,因此如果您愿意,您可以将其复制回内联。 (不用担心,我根据您的版本检查了结果 => 完全相同)。请注意,此函数不输出复数,因此无需比较虚部。

function P = phillips(Kx, Ky, windDir, windSpeed, A, g)
%// The function now accept scalar, vector or full 2D grid matrix as input
    K_sq = Kx.^2 + Ky.^2;
    L = windSpeed.^2 ./ g;
    k_norm = sqrt(K_sq) ;
    WK = Kx./k_norm * windDir(1) + Ky./k_norm * windDir(2);
    P = A ./ K_sq.^2 .* exp(-1.0 ./ (K_sq * L^2)) .* WK.^2 ;
    P( K_sq==0 | WK<0 ) = 0 ;
end

主程序调用的下一个函数是calc_wave.m。该函数完成波场的计算在给定时间内。它本身绝对值得拥有,因为这是最小的计算集,当您想要为波浪设置动画时,必须在每个给定时间重复计算。

function Z = calc_wave( H0,W,time,Grid_Sign )
% Z = calc_wave( H0,W,time,Grid_Sign )
%
% This function calculate the wave height based on the wave coefficients H0
% and W, for a given "time". Default time=0 if not supplied.
% Fourth output parameter is optional (easy to recalculate anyway)

    % recalculate the grid sign if not supplied in input
    if nargin < 4
        Grid_Sign = signGrid( param.meshsize ) ;
    end
    % Assign time=0 if not specified in input
    if nargin < 3 ; time = 0 ; end

    wt = exp(1i .* W .* time ) ;
    Ht = H0 .* wt + conj(rot90(H0,2)) .* conj(wt) ;  
    Z = real( ifft2(Ht) .* Grid_Sign ) ;
end

最后 3 行计算需要一些解释,因为它们收到了最大的变化(所有结果相同,但速度更快)。

你原来的行:

Ht = H0 .* exp(1i .* W .* (t * timeStep)) + conj(flip(flip(H0,1),2)) .* exp(-1i .* W .* (t * timeStep));

多次重新计算同一件事以提高效率:

(t * timeStep)在每次循环时在线上计算两次,同时很容易获得正确的time当每行的值time在循环开始时初始化for time = (1:nSteps)*timeStep.
另请注意exp(-1i .* W .* time)是相同于conj(exp(1i .* W .* time))。与其进行 2*m*n 乘法来计算它们,不如先计算一次,然后使用conj()操作速度要快得多。 所以你的单行将变成:

wt = exp(1i .* W .* time ) ;
Ht = H0 .* wt + conj(flip(flip(H0,1),2)) .* conj(wt) ;

最后的轻微接触,flip(flip(H0,1),2))可以替换为rot90(H0,2)(也稍微快一些)。

请注意,因为函数calc_wave将被广泛重复,减少计算次数绝对是值得的(就像我们上面所做的那样),而且还可以通过向其发送Grid_Sign参数(而不是让函数每次迭代都重新计算它)。这就是为什么:

你的神秘功能signCor(ifft2(Ht),meshSize)),只需反转每个其他元素的符号Ht。有一种更快的方法可以实现这一点:简单地相乘Ht由相同大小的矩阵 (Grid_Sign) 这是一个交替矩阵+1 -1 ...等等。

so signCor(ifft2(Ht),meshSize)变成ifft2(Ht) .* Grid_Sign.

Since Grid_Sign仅取决于矩阵大小,对于每个矩阵大小都不会改变time在循环中,您只计算一次(在循环之前),然后像其他每次迭代一样使用它。计算如下(矢量化,因此您也可以将其内联到代码中):

function sgn = signGrid(n)
% return a matrix the size of n with alternate sign for every indice
% ex:     sgn = signGrid(3) ;
%         sgn =
%             -1     1    -1
%              1    -1     1
%             -1     1    -1

    [x,y] = meshgrid(1:n,1:n) ;
    sgn = ones( n ) ;
    sgn(mod(x+y,2)==0) = -1 ;
end

最后,您会注意到网格的方式有所不同[Kx,Ky]是在你的版本和这个版本之间定义的。它们确实会产生略有不同的结果,这只是一个选择问题。
为了用一个简单的例子来解释,让我们考虑一个小例子meshsize=5。您的处理方式会将其分为 5 个等距值,如下所示:

Kx(first line)=[-1.5 -0.5 0.5 1.5 2.5] * 2 * pi / patchSize

虽然我生成网格的方式将生成等间距的值,但也以域限制为中心,如下所示:

Kx(first line)=[-2.50 -1.25 0.0 1.25 2.50] * 2 * pi / patchSize

看来更尊重你的评论% = 2*pi*n / Lx, -N/2 <= n < N/2在您定义它的行上。

我倾向于更喜欢对称解决方案(而且它也稍快一些,但只计算一次,所以这没什么大不了的),所以我使用了我的矢量化方式,但这纯粹是一个选择问题,你绝对可以保持你的方式,它只会稍微“偏移”整个结果矩阵,但它本身不会扰乱计算。


last remains of the first answer
Side programming notes: I detect you come from the C/C++ world or family. In Matlab you do not need to define decimal number with a coma (like 2.0, you used that for most of your numbers). Unless specifically defined otherwise, Matlab by default cast any number to double, which is a 64 bit floating point type. So writing 2 * pi is enough to get the maximum precision (Matlab won't cast pi as an integer ;-)), you do not need to write 2.0 * pi. Although it will still work if you don't want to change your habits.

另外,(Matlab 的一大好处),添加.运算符之前通常表示“逐元素”操作。你可以加 (.+), 减去 (.-), 乘以 (.*),除以(./)以这种方式完整矩阵元素。这就是我摆脱代码中所有循环的方法。这也适用于幂运算符:A.^2将返回一个大小相同的矩阵A每个元素都平方。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Matlab/CUDA:海浪模拟 的相关文章

  • 如何使用 Objective-C 在 Mac Os X 中模拟 Unicode Char“按键”?

    我想在 Mac OS X 中模拟 unicode 字符发送到前台应用程序 我的意思是我有一个像 a 这样的unicode char 可以包含阿拉伯语 中文等 我想输入它 请注意 我并不是尝试使用虚拟按键或按键代码 只有一个角色 您忠诚的 佩
  • 在 matlab/octave 中将数据集分成两个子集 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 将数据集分为两个子集 例如 训练 和 测试 其中 训练集包含 80 的数据 测试集包含剩余的 20 分裂的意思是生成一个长度等于的逻辑索引
  • 如何选择部分密集数据集的均匀分布子集?

    P是一个 n d 矩阵 持有nd 维样本 P某些地区的密度是其他地区的几倍 我想选择一个子集P其中任意样本对之间的距离大于d0 并且我需要将其传播到整个区域 所有样本都具有相同的优先级 无需优化任何内容 例如覆盖面积或成对距离之和 这是执行
  • 如何读取 10 位原始图像?其中包含 RGB-IR 数据

    我想知道如何从我的 10 位原始 它有 rgb ir 图像数据 数据中提取 RGB 图像 如何使用 Python 或 MATLAB 进行阅读 拍摄时的相机分辨率为 1280x720 室内照片图片下载 https drive google c
  • opencv中矩阵的超快中值(与matlab一样快)

    我正在 openCV 中编写一些代码 想要找到一个非常大的矩阵数组 单通道灰度 浮点数 的中值 我尝试了几种方法 例如对数组进行排序 使用 std sort 和选择中间条目 但与 matlab 中的中值函数相比 它非常慢 准确地说 在 ma
  • iOS 模拟器无法正确刷新

    我尝试模拟一个在 Xcode 9 中创建的非常非常简单的应用程序 我尝试在装有 iOS 11 2 的 iPhone6 的 iOS 模拟器中模拟它 我还测试了其他设备 结果相同 在真实设备上 该应用程序可以按预期运行 但在模拟器上却没有 我希
  • 白色像素簇提取

    我正在研究指纹毛孔提取项目 并陷入毛孔 白色像素簇 提取的最后阶段 我有两个输出图像 我们可以从中获取毛孔 但不知道该怎么做 这两个图像的尺寸不同 image1 的尺寸为 240 320 image2 的尺寸为 230 310 这是我的图像
  • 通过傅里叶空间填充进行插值

    我最近尝试在 matlab 上实现一个在傅立叶域中使用零填充的插值方法的简单示例 但我无法正常工作 我总是有一个小的频移 在傅里叶空间中几乎不可见 但它在时空上产生了巨大的误差 由于傅里叶空间中的零填充似乎是一种常见 且快速 的插值方法 因
  • 频域和空间域的汉明滤波器

    我想通过在 MATLAB 中应用汉明滤波器来消除一维信号中的吉布斯伪影 我所拥有的是k1这是频域中的信号 我可以通过应用 DFT 来获取时域信号k1 s1 ifft ifftshift k1 该信号具有吉布斯伪影 现在 我想通过 A 乘以汉
  • 在 MATLAB 中定义其他中缀运算符

    有没有办法在 MATLAB 中定义额外的中缀运算符 具体来说 我想定义两个中缀运算符 gt and lt gt 这些符号是理想的 但如果需要 它可以是单个字符 它调用函数implies and iff以同样的方式 calls and and
  • 优化 MATLAB 代码(嵌套 for 循环计算相似度矩阵)

    我正在 MATLAB 中基于欧几里德距离计算相似度矩阵 我的代码如下 for i 1 N M N is the size of the matrix x for whose elements I am computing similarit
  • 为什么 MATLAB 本机函数 cov(协方差矩阵计算)使用与我预期不同的除数?

    给定一个 M 维和 N 个样本的数据矩阵数据 例如 data randn N M 我可以计算协方差矩阵 data mu data ones N 1 mean data cov matrix data mu data mu N 如果我使用原生
  • 为什么 MATLAB 在打印大量 (.png) 图形时速度会变慢?

    我正在将大量数字打印为 png 文件 每个图都是数据矩阵中的一列图 我获取 png 文件并将它们串在一起形成动画 我的问题是 前几百张图像打印得很快 但创建每个新图形的时间却迅速增加 从前几百个 png 文件的约 0 2 秒到第 800 个
  • 如何使用 CUDA/Thrust 对两个数组/向量根据其中一个数组中的值进行排序

    这是一个关于编程的概念问题 总而言之 我有两个数组 向量 我需要对一个数组 向量进行排序 并将更改传播到另一个数组 向量中 这样 如果我对 arrayOne 进行排序 则对于排序中的每个交换 arrayTwo 也会发生同样的情况 现在 我知
  • 从 Java 运行 MATLAB 函数

    我在 MATLAB 中有一个 m 文件 我想从 Java 调用该文件 并以字符串或 Java 中的任何形式获取解决方案 这听起来很简单 但由于某种原因我无法让它发挥作用 我试过这个 matlab nosplash wait nodeskto
  • 为什么 mex 文件中的 OpenMP 仅产生 1 个线程?

    我是 OpenMP 新手 我有以下代码 使用配置了 MSVS2010 的 Matlab mex 可以正常编译 计算机有 8 个可用处理器 我也使用 matlabpool 检查过 include mex h include
  • 使用 R2010b 中的符号工具箱来求解和/或 linsolve

    我前几天问了一个问题here https stackoverflow com questions 20317038 matlab linear congruence solver that supports a non prime modu
  • matlab部署工具到java包javac错误

    我正在尝试将我的程序包装为与 java 一起使用 我首先尝试了一个简单的 hello world 你好世界 m disp 你好世界 我使用了deploytool并选择了java包 当它到达这一行时 执行命令 javac verbose cl
  • 从筛查乳腺 X 光检查数字数据库 (DDSM) 获取数据

    我正在尝试以可读格式获取 DDSM 数据集 有谁有 DDSM heathusf 程序的工作版本 可以在 Linux 或 Windows 上正常运行吗 我知道 DDSM 的 jpeg 程序有一个适用于 linux 的工作版本 位于http w
  • Matlab颜色检测

    我试图一致地检测同一场景的图像之间的某种颜色 这个想法是根据颜色配置文件识别一组对象 因此 例如 如果给我一个带有绿色球的场景 并且我选择绿色作为我的调色板的一部分 我想要一个具有反映它检测到球的矩阵的函数 任何人都可以为这个项目推荐一些

随机推荐

  • Android Drawable 内存泄漏

    我使用几个大型绘图 但不知道如何管理内存泄漏 我跟踪了应用程序的堆大小 它不会停止增长 与分配的内存一样 尤其是 字节数组 byte 类型 它只会增长且永不减少 在 Eclipse 上的 DDMS 堆视图中 我的应用程序由一个使用片段的活动
  • 如何从正在运行的 QThread 向启动它的 PyQt Gui 发送信号?

    我试图了解如何使用从 Qthread 发送回启动的 Gui 界面的信号 设置 我有一个进程 模拟 需要几乎无限期地运行 或至少运行很长一段时间 在运行时 它会执行各种计算 并且某些结果必须发送回GUI 它将实时适当地显示它们 我使用 PyQ
  • 如何使 Qt Creator 的调试器在 OS X 中显示 C++ 矢量的内容?

    我正在编写一个广泛使用向量的程序 并且是第一次在 Mac OS X 10 6 6 上使用 Qt Creator 2 0 1 进行开发 当我调试时 我可以在Locals and Watchers窗口 但是一旦我去扩展一个向量 在这种情况下类型
  • 了解MyISAM记录结构

    我试图了解 MyISAM 如何物理存储其记录以及在记录插入和删除记录后如何维护其结构 我已阅读以下链接 MyISAM 动态数据文件布局 MyISAM记录结构 我想确认一下我的理解是否正确 如果不对请指正 固定大小的记录 删除标记决定记录是否
  • 枚举和枚举的区别

    枚举有valueOf string 获取枚举常量的方法和中存在的相同类型的方法java lang Enum有名字的类valueOf enumClassName string 我发现两者都给出相同的输出 那还有什么其他的区别呢 如果没有区别那
  • 装饰器的类型注释

    这不是一个大问题 但我只是想知道解决这个问题的方法 由于我刚开始在Python上使用函数注释 所以我不熟悉它 我有一个问题如下 当你制作一个装饰器并想在其上添加注释时 你该怎么做 例如 如下代码 def decorator func Cal
  • NCO:使用 NCO ncks 从 NetCDF 文件中提取变量

    我试图通过输入以下命令从多变量 netcdf 文件中提取变量 ncks v ta temp1 nc out nc 然而 当我查看 out nc 标头时 所有变量仍然存在 temp1 nc 和 out nc 的标头如下 temp1 nc he
  • 在布局 xml 中设置 Magento 块模板

    在 Magento 的布局 xml 中设置块模板时遇到问题 我试图设置子块的模板 而不是整个页面布局 几乎所有文档都解释了如何设置布局模板 背景 我是updating我的自定义操作中的布局句柄 使用
  • GraphQL 查询在 Gatsby 页面中有效,但在类组件中无效

    有几个类似的问题 但除了页面文件夹中的组件之外 没有一个问题可以帮助我真正理解在 类 组件中使用 GraphQL 我的项目结构如下所示 src components aboutBody index js pages about js 我有一
  • 如何检测单个文件的文件系统大小限制

    有没有办法检测单个文件的文件系统大小限制 例如 fat 32 上的 4GB 它必须在 Windows 操作系统上运行 但最好是便携式解决方案 检测文件系统类型可能是一种解决方法 但我也不知道如何做到这一点 有人可以帮我吗 先感谢您 托比亚斯
  • Typescript 编译为单个文件

    我正在使用 TS 1 7 我正在尝试将我的项目编译为一个大文件 我将能够将其包含在我的 html 文件中 我的项目结构如下所示 build Build directory src source root main ts my Main fi
  • 将函数转换为使用尾递归——一项正式研究

    有没有人写过一篇正式论文描述一种 自动 将函数转换为尾递归的方法 我正在寻找大学级别的正式处理 包括限制 可以转换的函数类型 转换程序 以及 如果可能 正确性证明 Haskell 中的例子将是一个额外的好处 一种 自动 将函数转换为尾递归的
  • 在 iPhone 上“解压”文件

    我正在编写一个 iPhone 应用程序 它从网络服务器下载一个 tar gzip 压缩文件 然后需要取消存档该文件 以便可以将其复制到应用程序的 Documents 文件夹中 我使用 tar gzip 是因为我想在一个 HTTP 请求中下载
  • 在WebView Metro Style应用程序中加载本地html文件

    我在 Metro 风格应用程序的 WebView 控件中加载 html 文件时遇到了一些问题 我一直在互联网上搜索 发现无法使用 NavigateTo 方法加载本地 html 文件 我还发现有一种解决方法 您可以使用控件的 Navigate
  • 如何计算 Objective-C 中特定日期的一年中的第几天?

    这是我发现自己花了几个小时才弄清楚的事情 因此想与大家分享 问题是 如何确定特定日期是一年中的哪一天 例如当不是闰年时 1月15日是第15天 12月31日是第365天 尝试这个 NSCalendar gregorian NSCalendar
  • 复合类型数组的正确语法

    CREATE TYPE pencil count AS pencil color varchar 30 count integer CREATE TABLE pencils id serial pencils pencil count IN
  • ggplot2 按组绘制曲线下阴影面积

    我正在尝试对两条曲线下的区域进行着色 我想得到与中完全相同的图 尽管没有阈值 上一篇文章 唯一的区别是我想使用geom line 代替stat density 有什么办法可以做到这一点吗 提前致谢 我已经尝试过该帖子中建议的方法 但是当我使
  • 我应该向 App Store 发布一个包含打印语句的应用程序吗?

    我打算很快将我的应用程序发布到 App Store 在 TestFlight 之后 我有很多视图控制器print其中的陈述 这print语句用于测试目的 调试器 用户永远不会看到它们 发布后 如果我在应用程序中包含或不包含打印语句 会有什么
  • 如何发布选择列表中的所有选项?

    我有一个选择多个列表 其中包含一些项目 它是 ACL 的 IP 地址列表 人们可以添加 删除 IP 然后保存列表 但是 除非您选择列表中的某个项目 POST selectName 不包含任何值 我怎样才能做到这一点 我知道我可以用 java
  • Matlab/CUDA:海浪模拟

    我学过 模拟海水 Jerry Tessendorf 的文章并尝试对统计波模型进行编程 但我没有得到正确的结果 我不明白为什么 In my program I tried only to create a wave height field