^
是MATLAB中的指数运算符。它的问题在于它不存在于很多非英语键盘布局中,如果你在工作中使用它很多,在HR和EN之间切换会很麻烦。
有没有办法将它添加到MATLAB的工具栏(就像在Excel中,所以你可以通过鼠标或触摸板使用它),或者在MATLAB中定义一个自定义键(例如,F12)来替换它?
我希望有一个非AHK解决方案,等等。
答案 0 :(得分:11)
在Windows中(启用Num Lock),按住 Alt ,在数字小键盘上键入 9 4 ,然后释放 ALT 。 ^
将插入光标处。
这是在Windows中插入任意Unicode字符的一般技术,无论它们是否在键盘上。
^
字符为U+5E
,小数为94
。
答案 1 :(得分:11)
创建工具栏快捷方式,为其命名,并将以下内容放入回调中:
clipboard('copy','^')
运行此命令会将指数字符^
放在剪贴板中。按下它后,执行 Ctrl + V 将其粘贴。
您可以应用此想法来创建可从MATLAB的“开始”菜单访问的片段片段库。
答案 2 :(得分:6)
我建议在EditorMacro上从Yair Altman下载提交内容MathWorks File Exchange。如果在MATLAB命令窗口中运行以下代码(当MATLAB编辑器打开时):
EditorMacro('Alt 6','^');
它会在MATLAB编辑器和命令窗口的上下文中创建一个宏,当你按下组合键 Alt + 时,它会在插入符号位置插入字符串^
6 (据我所知,不应该绑定到任何其他宏/操作。)
由于您提到在Croatian和English键盘布局之间来回切换,因此必须记住相同符号的不同组合键可能很烦人。使用EditorMacro
,您可以在MATLAB编辑器和命令窗口中创建一组宏,这样您就可以对每个符号使用相同的按键组,而不管您使用的键盘类型如何。
由于每次关闭MATLAB时都会删除用EditorMacro
创建的宏,因此可以创建一个startup.m
file(每次打开MATLAB时会自动运行)来为您创建宏。该文件可能如下所示:
edit; %# Open the Editor so EditorMacro works properly
EditorMacro('Alt 5','%'); %# Create "%" macro
EditorMacro('Alt 6','^'); %# Create "^" macro
EditorMacro('Alt 7','&'); %# Create "&" macro
...
在这个例子中,我基本上使用 Alt 来再现 Shift 的行为加上英文键盘上的数字。
如果一切都失败了......
您始终可以使用functional forms of the arithmetic operators作为最后手段:
power(A,B)
而非元素强制操作A.^B
mpower(A,B)
代替矩阵电源操作A^B
它不会漂亮,但它会起作用。
答案 3 :(得分:3)
你有哪种键盘没有?
http://msdn.microsoft.com/en-us/goglobal/bb964651.aspx
我们在看到这个问题后做了快速检查,找不到没有符号的键盘。
与我们的MATLAB I18N团队讨论此事并提出增强请求。
答案 4 :(得分:2)
好的......这是一个hack,它允许你在Matlab的命令窗口和编辑器中重新映射任意键击。这是一个不受支持的黑客攻击,它涉及IDE的未记录内部。但它像你所希望的那样“神奇”。适合我在R2008b和R2009b中使用。
首先,定义一个可以通过将其替换为其他击键输入来处理事件的Java类。将其编译为JAR并将其放在Matlab的javaclasspath上。
package test;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.text.JTextComponent;
import javax.swing.text.TextAction;
/**
* An action that responds to an event with another keystroke.
*/
public class KeyReplacementAction extends TextAction {
private final char replacement;
/**
* @param name Name of this action (ignored in practice)
* @param replacement char to replace the event with
*/
public KeyReplacementAction(String name, char replacement) {
super(name);
this.replacement = replacement;
}
public void actionPerformed(ActionEvent e) {
if (!(e.getSource() instanceof JTextComponent)) {
return;
}
JTextComponent src = (JTextComponent) e.getSource();
KeyEvent replacementEvent = new KeyEvent(src, KeyEvent.KEY_TYPED,
java.lang.System.currentTimeMillis(), 0,
KeyEvent.VK_UNDEFINED, replacement);
src.dispatchEvent(replacementEvent);
}
}
现在,使用Matlab代码深入了解IDE的Swing小部件,找到编辑器和命令窗口的键盘映射,并添加处理程序以重新映射到它们。
function remap_keys_in_text_areas()
%REMAP_KEYS_IN_TEXT_AREAS Custom key remapping in Matlab GUI text areas
%
% Must be called after the editor is open, otherwise it won't find the
% editor keymap.
% { from, to; ... }
% Try "disp(char(1:1024))" to see all chars that work in your Matlab font
map = {
'$' '^'
'#' char(181) % might be useful for text formatting
};
make_sure_editor_is_open(); % otherwise we won't find its keymap
keymaps = find_ide_keymaps();
for i = 1:size(map,1)
[from,to] = map{i,:};
disp(sprintf('Re-binding %s to %s in text areas', from, to));
for j = 1:numel(keymaps)
bind_keystroke_for(keymaps{j}, from, to);
end
end
function make_sure_editor_is_open()
s = find_editor_widgets();
if isempty(s.editors)
edit;
end
function bind_keystroke_for(keymap, from, to)
%BIND_KEYSTROKE_FOR Remap a single keystroke in a text component
import javax.swing.KeyStroke;
import java.awt.event.InputEvent;
import test.KeyReplacementAction;
key = javax.swing.KeyStroke.getKeyStroke(from);
action = KeyReplacementAction(['remap ' from ' to ' to], to);
keymap.addActionForKeyStroke(key, action);
function out = find_ide_keymaps
%FIND_IDE_KEYMAPS Find keymap objects for Matlab IDE widgets
set = java.util.HashSet();
s = find_editor_widgets();
widgets = [s.cmdwin s.editors];
for i = 1:numel(widgets)
set.add(widgets{i}.getKeymap());
end
set = set.toArray();
out = cell(size(set));
for i = 1:numel(set)
out{i} = set(i);
end
function out = find_editor_widgets
%FIND_EDITOR_WIDGETS Find editor and command window widgets in Matlab Swing GUI
out.cmdwin = [];
out.editors = {};
wins = java.awt.Window.getOwnerlessWindows();
for i = 1:numel(wins)
if isa(wins(i), 'com.mathworks.mde.desk.MLMainFrame')
out.cmdwin = get_command_window_from_mainframe(wins(i));
elseif isa(wins(i), 'com.mathworks.mde.desk.MLMultipleClientFrame')
out.editors = [out.editors get_text_areas_from_editor_frame(wins(i))];
end
end
function out = get_command_window_from_mainframe(frame)
out = findobj_swing_widget(frame, 'com.mathworks.mde.cmdwin.XCmdWndView');
function out = get_text_areas_from_editor_frame(frame)
out = findobj_swing_widget(frame, 'com.mathworks.widgets.SyntaxTextPane');
function out = findobj_swing_widget(widget, klass)
%FINDOBJ_SWING_WIDGET Recursively find all child components of given class
out = {};
if isa(widget, klass)
out{end+1} = widget;
end
for i = 1:widget.getComponentCount()
out = [out findobj_swing_widget(widget.getComponent(i-1), klass)];
end
要激活重映射,只需调用该函数即可。您可以在startup.m中执行此操作以使其自动发生。
>> remap_keys_in_text_areas Re-binding $ to ^ in text areas Re-binding # to µ in text areas
答案 5 :(得分:1)
您可以简单地使用以下数学标识:
a^b ≡ exp(b*ln(a))
我刚要建议使用C风格POWER(A,B)
函数来替换^
运算符的功能,但是gnovice打败了我。我想这就是POWER(A,B)
和MPOWER(A,B)
函数的基础。
从发布的答案中可以看出,有很多选择。这是品味,功能和重复的问题。